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"]