需求,日志收集的时候,时间格式是国际标准时间格式。形如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