需求,日志收集的时候,时间格式是国际标准时间格式。形如yyyy-MM-dd'T'HH:mm:ss.SSS。 (2023-12-05T02:45:50.282Z)这个时区也不对,那如何将此类型的时间,进行格式化呢?
本篇文章体统一个案例,可以格式化各种类型的时间,已经调整到各个时区。
先看效果
如何做到?
这里使用了es的 pipeline 来转换数据。因为日志是beat收集的,如果使用logstash收集日志,则可以在logstash上进行修改。这里并不需要引入新的技术,已经引入更多的资源开销。实际上logstash的资源开销还是很大的。固这里使用 pipeline 的方式。
添加一个 pipeline 管道
PUT _ingest/pipeline/angus_test_pipeline
{"description": "日期格式化示例","processors": [{# 用到管道的时间处理"date": {# 要转换的字段。"field": "crawler_time",# 转换后的字段,这里是可以将字段转到另外一个字段上,也可以转回当前字段。"target_field": "crawler_time",# 注意这里是输入时间的格式,可以填多个。因为是标准时间,所以指定了ISO8601。这里一定要知道自己输入的时间格式,然后配置到这里。"formats": ["ISO8601"],# 这里是输出字段的时间格式。然后会进行格式化。"output_format": "yyyy-MM-dd HH:mm:ss",# 如果想要调整时区,在这里修正时区。注意这是输出时间的时区。"timezone": "Asia/Shanghai"}}]
}
创建索引,指定默认的管道
这里只用了最见到的配置,为了测试好演示。其它配置都是默认的。
PUT angus_temp
{"mappings": {"properties": {"crawler_time": {"type": "date","format": "yyyy-MM-dd HH:mm:ss"}}},"settings": {"index": {"default_pipeline": "angus_test_pipeline"}}
}
添加一条时间测试
POST angus_temp/_doc/1
{"crawler_time":"2023-12-05T02:45:50.282Z"
}
验证结果
GET angus_temp/_search