1.需求
EFK日志系统采集日志时,采集时间和日志真正生成的时间会有差异,开发一般需要根据日志真正的生成时间在kibana中进行查询
2.解决方案
将收集到的日志的时间抽取出来,替换默认的@timestamp字段(将@timestamp字段赋值给其他字段用来记录)
logstash的配置(测试环境):
filter {
grok {
match => { "message" => "(\s*%{TIMESTAMP_ISO8601:timestamp}\s*\[.*\]\s*%{LOGLEVEL:loglevel}.*%{UUID:traceId})" }
}
ruby {
code => "event.set('collection_time', event.get('@timestamp'))"
}
date {
match => ["timestamp", "yyyy-MM-dd HH:mm:ss.SSS"]
target => "@timestamp"
}
mutate {
remove_field => [ "host","timestamp" ]
}
}
注意:@timestamp被赋值后会比当前时间少8h,所以需要在ruby代码中设置
code => "event.set('collection_time', event.get('@timestamp')+8*60*60)"
注意:生产环境和测试环境输出日志的精度可能不一样
比如,生产环境的日志精度最后是四位,那么date插件的配置如下:
match => ["timestamp", "yyyy-MM-dd HH:mm:ss.SSSS"]