说明
日期过滤器用于解析字段中的日期,然后使用该日期或时间戳作为事件的logstash时间戳。
日期过滤器对于事件排序和回填旧数据尤其重要。如果您在活动中没有得到正确的日期,那么稍后搜索它们可能会导致排序混乱。
在没有此过滤器的情况下,如果未在事件中设置时间戳,logstash将基于它第一次看到该事件(在输入时间)选择一个时间戳。例如,对于文件输入,时间戳记设置为每次读取的时间
所以我们需要在logstash挖掘日志的时候将时间戳换成日志本身产生的时间,不应该是logstash挖掘时候的系统时间 这样我们会混乱
编写一个date过滤插件
input { stdin { } }
filter {
grok { match => [ "message", "%{HTTPDATE:[@metadata][timestamp]}" ] }
date { match => [ "[@metadata][timestamp]", "dd/MMM/yyyy:HH:mm:ss Z" ] }
}
output {
stdout { codec => rubydebug }
--------------
date插件还可以写成这种
date {
match => [ "logdate", "dd/MMM/yyyy:HH:mm:ss Z" ]
target => "@timestamp"
}
-- 修改时间戳成为日志产生的时间
注意:时区偏移量只需要用一个字母 Z 即可。
image.png时区问题的解释
很多中国用户经常提一个问题:为什么 @timestamp 比我们早了 8 个小时?怎么修改成北京时间?
- 其实,Elasticsearch 内部,对时间类型字段,是统一采用 UTC 时间,存成 long 长整形数据的!对日志统一采用 UTC 时间存储,是国际安全/运维界的一个通识——欧美公司的服务器普遍广泛分布在多个时区里——不像中国,地域横跨五个时区却只用北京时间。
- 对于页面查看,ELK 的解决方案是在 Kibana 上,读取浏览器的当前时区,然后在页面上转换时间内容的显示。
- 所以,建议大家接受这种设定。否则,即便你用 .getLocalTime 修改,也还要面临在 Kibana 上反过去修改,以及 Elasticsearch 原有的
["now-1h" TO "now"]
这种方便的搜索语句无法正常使用的尴尬。
网友评论