文章目录
- 问题
- 解决方式
- 参考
问题
在使用Kibana观察日志排查问题时发现存在很多组的@timestamp 数据一样,如下所示
详细观察内部数据发现其中日志数据有一个timestamp字段保存的是业务日志的毫秒级时间戳,经过和@timestamp数据对比发现二者的时间不匹配。经过分析得知@timestamp是按照logstash插入es数据的时间来排序,而且数据是按照批次来的,每一批次的时间可能都是大径相同,结果就是导致上面描述的一系列问题。
解决方式
针对该问题,我们可以使用logstash中的filter中date属性来进行日期的转换,即使用业务日志中的timestamp字段去替换掉logstash自己生成@timestamp时间。
date属性的使用参考如下:
https://www.elastic.co/guide/en/logstash/current/plugins-filters-date.html
date {
match => [ "biz_time", "yyyyMMdd HH:mm:ss.SSS" ]
target => "new_time"
}
简单的使用配置参考如上所示,其中match匹配处理输入日志数据的那个字段以及对应的数据类型,target表示要去匹配映射的字段,可以是一个已存在的字段也可以是一个新的字段。
需要注意的是,你必须要严格匹配输入日志对应属性的日期类型,如果你是类似2023-01-01 12:12那么就需要指定为这样的日期格式,如果是时间戳那么就需要指定为UNIX或者UNIX_MS,前者为秒级的时间戳后者为毫秒级的时间戳,需要严格对应的,否则会无法匹配转换。
举例:下面为项目的业务日志信息,我想要使用红色框内的timestamp字段为@timestamp时间
参考配置如下:
filter{
date{
match=>["timestamp", "UNIX_MS" ]
target=>"@timestamp"
}
}
修改配置完后,重启logstash,观察启动日志,然后再看索引数据
参考
【如何将时间戳转换为日期字段数据】
https://discuss.elastic.co/t/how-to-convert-a-unix-timestamp-field-to-a-new-date-field/50966
【logstash中date转换】
https://www.elastic.co/guide/en/logstash/current/plugins-filters-date.html