ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ## 描述 date过滤器用于解析字段中的日期,然后使用该日期或时间戳作为事件的logstash时间戳。 例如,syslog事件通常有这样的时间戳: ~~~ "Apr 17 09:32:01" ~~~ 你应该使用`MMM dd HH:mm:ss`的日期格式来解析这个。 日期过滤器对于事件的排序和对旧数据的回填特别重要,如果在你的事件中没有得到正确的日期,那么以后搜索它们可能会出现顺序不对。 如果没有这个过滤器,logstash将根据第一次看到事件(在输入时)的时间(如果时间戳还没有在事件中设置)选择一个时间戳,例如,对于文件输入,时间戳被设置为每次读取的时间。 ## Date过滤器配置选项 这个插件支持以下配置选项以及后面描述的通用选项。 | 设置 | 输入类型 | 要求 | | --- | --- | --- | | `locale` | string | No | | `match` | array | No | | `tag_on_failure` | array | No | | `target` | string | No | | `timezone` | string | No | 还可以查看所有过滤器插件支持的选项列表的通用选项。 `locale` * 值类型为string * 此设置没有默认值 * 使用IETF-BCP47或POSIX语言标记指定要用于日期解析的语言环境,简单的例子有`en`,`en-US`代表BCP47,`en_US`代表POSIX。 * 对于解析月份名称(带有`MMM`的模式)和工作日名称(带有`EEE`的模式),通常需要设置语言环境。 * 如果没有指定,将使用平台默认值,但对于非英语平台默认值,还将使用英语解析器作为回退机制。 `match` * 值类型为array * 默认值为`[]` * 首先是字段名,然后是格式模式的数组,`[ field, formats... ]` * 如果你的时间字段有多种可能的格式,你可以这样做: ~~~ match => [ "logdate", "MMM dd yyyy HH:mm:ss", "MMM d yyyy HH:mm:ss", "ISO8601" ] ~~~ * 以上内容将匹配syslog(rfc3164)或`iso8601`时间戳。 * 有一些特殊的例外,下面的格式文字可以帮助你节省时间并确保数据解析的正确性。 * `ISO8601` - 可以解析任何有效的ISO8601时间戳,像:`2011-04-19T03:44:01.103Z` * `UNIX` - 解析**float或int**值表示自纪元以来的unix时间(如1326149001秒),132和1326149001一样。 * `UNIX_MS` - 解析**int**值表示自纪元以来的unix时间(如1366125117000毫秒) * `TAI64N` - 会解析tai64n时间值 * 例如,如果你有一个字段`logdate`,其值类似于`Aug 13 2010 00:03:44`,那么你将使用这个配置: ~~~ filter { date { match => [ "logdate", "MMM dd yyyy HH:mm:ss" ] } } ~~~ * 如果字段嵌套在结构中,可以使用嵌套语法`[foo][bar]`匹配其值,有关更多信息,请参阅[字段参考资料](https://segmentfault.com/a/1190000016594400) * **关于语法的更多细节** * 用于解析日期和时间文本的语法使用字母表示时间值的类型(月份、分钟等),重复使用字母表示该值的形式(两位数的月份、完整的月份名称等)。 * 下面是用来解析日期和时间的方法: * y 年 * yyyy => 全年数字,例如:`2015`。 * yy => 两位数的年,例如:`15`代表`2015`年。 * M 一年中的月份 * M => 最小位数的月份,例如:`1`为1月,`12`为12月。 * MM => 两位数的月份,如果需要将用零填充,例如:`01`为1月,`12`为12月。 * MMM => 缩写月文本,例如:`Jan`为1月,注意:使用的语言取决于你的语言环境,查看`locale`设置如何更改语言。 * MMMM => 全月的文本,例如:`January`,注意:使用的语言取决于你的语言环境。 * d 一月中的天 * d => 最小位数的天,例如:`1`为一个月的第一天。 * dd => 两位数的天,如果需要将用零填充,例如:`01`为一个月的第一天。 * H 一天中的小时(24小时时钟) * H => 最小位数的小时,例如:`0`为午夜。 * HH => 两位数的小时,如果需要,零填充,例如:`00`为午夜。 * m 一小时中的分钟(每小时60分钟) * m => 最小位数的分钟,例如:`0`。 * mm => 两位数的分钟,如果需要,零填充,例如:`00`。 * s 一分钟中的秒(每分钟60秒) * s => 最小位数的秒,例如:`0`。 * ss => 两位数的秒,如果需要,零填充,例如:`00`。 * S 每秒最大精度的分数为毫秒(`SSS`),超过这个,追加零 * S => 十分之一秒,例如:`0`表示亚秒值`012`。 * SS => 百分之一秒,例如:`01`为亚秒值`01`。 * SSS => 千分之一秒,例如:`012`为亚秒值012。 * Z 时区偏移或标识 * Z => 时区偏移结构为HHmm(Zulu/UTC的小时和分钟偏移),例如:`-0700`。 * ZZ => 时区偏移结构为HH:mm(在小时和分钟偏移量之间的冒号),例如:`-07:00`。 * ZZZ => 时区的标识,例如:`America/Los_Angeles`,注意:有效的id列在[Joda.org可用时区页面](http://joda-time.sourceforge.net/timezones.html)上。 * z 时区名称,**无法解析时区名称(z)**。 * w 一年中的周 * w => 最小位数的周,例如:`1`。 * ww => 两位数的周,如果需要,零填充,例如:`01`。 * D 一年中的天 * e 一周中的星期(数字) * E 一周中的星期(文本) * E, EE, EEE => 一周中缩短的星期,例如:`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`,`Sun`,注意:它的实际语言取决于你的语言环境。 * EEEE => 一周的星期全称,例如:`Monday`,`Tuesday`,...,注意:它的实际语言取决于你的语言环境。 * 对于非格式化语法,需要在值周围放置单引号字符,例如,如果你正在解析ISO8601时间,"2015-01-01T01:12:23"那个“T”不是有效的事件格式,并且你你可能想说"字面上的一个T",你的格式应该是这样:"yyyy-MM-dd’T'HH:mm:ss"。 * 其他不太常见的日期单元,如era(G)、century(C)、am/pm(a)和#更多,可以在[joda-time文档中了解](http://www.joda.org/joda-time/key_format.html)。 `tag_on_failure` * 值类型为array * 默认值为`["_dateparsefailure"]` * 当没有成功匹配时,将值附加到`tags`字段 `target` * 值类型为string * 默认值为`"@timestamp"` * 将匹配的时间戳存储到给定的目标字段中,如果没有提供,默认更新事件的`@timestamp`字段。 `timezone` * 值类型为string * 此设置没有默认值 * 指定用于日期解析的时区规范ID,有效的id列在[Joda.org可用时区页面](http://joda-time.sourceforge.net/timezones.html)上,这在无法从值中提取时区时非常有用,而且不是平台默认值。如果没有指定,将使用平台默认值,Canonical ID很好,因为它为你处理了夏令时,例如,`America/Los_Angeles`或`Europe/Paris`是有效的id。该字段可以是动态的,并使用`%{field}`语法包含事件的一部分。 ## 通用选项 所有过滤器插件都支持以下配置选项: | 设置 | 输入类型 | 要求 | | --- | --- | --- | | `add_field` | hash | No | | `add_tag` | array | No | | `enable_metric` | boolean | No | | `id` | string | No | | `periodic_flush` | boolean | No | | `remove_field` | array | No | | `remove_tag` | array | No | `add_field` * 值类型为hash * 默认值为`{}` * 如果此过滤器成功,则向此事件添加任意字段,字段名可以是动态的,并使用`%{field}`包含事件的一部分。 * 例如: ~~~ filter { date { add_field => { "foo_%{somefield}" => "Hello world, from %{host}" } } } ~~~ ~~~ # You can also add multiple fields at once: filter { date { add_field => { "foo_%{somefield}" => "Hello world, from %{host}" "new_field" => "new_static_value" } } } ~~~ * 如果事件具有字段`“somefield”==“hello”`,那么在成功时,这个过滤器将添加字段`foo_hello`(如果存在的话),上面的值和`%{host}`块将被事件中的值替换,第二个示例还将添加硬编码字段。 `add_tag` * 值类型为array * 默认值为`[]` * 如果此过滤器成功,则向事件添加任意tags,tags可以是动态的,并使用`%{field}`语法包含事件的一部分。 * 例如: ~~~ filter { date { add_tag => [ "foo_%{somefield}" ] } } ~~~ ~~~ # You can also add multiple tags at once: filter { date { add_tag => [ "foo_%{somefield}", "taggedy_tag"] } } ~~~ * 如果事件有字段`“somefield”==“hello”`,这个过滤器在成功时,会添加一个标签`foo_hello`(第二个例子当然会添加一个`taggedy_tag`标签)。 `enable_metric` * 值类型为boolean * 默认值为`true` * 默认情况下,我们会记录所有可以记录的指标,但你可以为特定的插件禁用指标集合。 `id` * 值类型为string * 此设置没有默认值 * 在插件配置中添加唯一的`ID`,如果没有指定ID,则Logstash将生成一个,强烈建议在配置中设置此ID,当你有两个或多个相同类型的插件时,这一点特别有用。例如,如果你有两个电子邮件输出,在本例中添加一个命名ID将有助于在使用监控API时监控Logstash。 ~~~ filter { date { id => "ABC" } } ~~~ `periodic_flush` * 值类型为boolean * 默认值为`false` * 定期调用过滤器flush方法,可选的。 `remove_field` * 值类型为array * 默认值为`[]` * 如果此过滤器成功,则从此事件中删除任意字段,例如: ~~~ filter { date { remove_field => [ "foo_%{somefield}" ] } } ~~~ ~~~ # You can also remove multiple fields at once: filter { date { remove_field => [ "foo_%{somefield}", "my_extraneous_field" ] } } ~~~ * 如果事件中有字段`“somefield”==“hello”`,那么在成功时,如果存在名为`foo_hello`的字段,这个过滤器将删除该字段,第二个示例将删除一个额外的非动态字段。 `remove_tag` * 值类型为array * 默认值为`[]` * 如果此过滤器成功,则从事件中删除任意tags,tags可以是动态的,并使用`%{field}`语法包含事件的一部分。 * 例如: ~~~ filter { date { remove_tag => [ "foo_%{somefield}" ] } } ~~~ ~~~ # You can also remove multiple tags at once: filter { date { remove_tag => [ "foo_%{somefield}", "sad_unwanted_tag"] } } ~~~ * 如果事件有字段`“somefield”==“hello”`,这个过滤器在成功时,会删除标签`foo_hello`如果它存在,第二个示例还将删除一个sad、unwanted的标记。