如何通过Logstash将@timestamp设置为仅年月日格式(不含时分秒)
解决Logstash导入CSV时@timestamp仅保留年月日的问题
首先得明确:Elasticsearch中的date类型本质是基于UTC时间戳存储的,哪怕你只传入年月日,它也会默认补全00:00:00的时分秒。所以直接让@timestamp(默认是date类型)只存储年月日做不到,但可以通过两种方式实现你要的效果:
1. 修改Elasticsearch映射,控制展示格式(推荐)
这种方式保留@timestamp的date类型(方便后续时间范围查询、聚合等操作),只是让ES在展示时只显示年月日:
- 如果是新建索引,在创建时指定映射:
{ "mappings": { "properties": { "@timestamp": { "type": "date", "format": "yyyy-MM-dd" // 也可设置为你需要的dd/MM/yy格式 } } } } - 如果索引已存在,用更新映射API修改:
PUT /你的索引名/_mapping { "properties": { "@timestamp": { "type": "date", "format": "yyyy-MM-dd" } } }
配置后,查询时@timestamp就只会显示年月日,不会带出时分秒。
2. 新增字符串类型的纯年月日字段
如果确实需要存储不含时分秒的纯文本日期,可以在Logstash中新增字段,将解析后的时间转成字符串格式:
方式一:用mutate插件格式化
date { match => ["date", "dd/MM/yy"] target => "@timestamp" } mutate { add_field => { "date_only" => "%{+yyyy-MM-dd}" } // 生成yyyy-MM-dd格式的字符串 }
方式二:用ruby插件自定义格式化
date { match => ["date", "dd/MM/yy"] target => "@timestamp" } ruby { code => 'event.set("date_only", event.get("@timestamp").strftime("%Y-%m-%d"))' }
之后在Elasticsearch中把date_only字段设置为keyword或text类型,就能存储纯年月日的字符串了。
补充:你之前的
date插件配置本身是正确的,它已经把date字段解析成了正确的时间,只是ES的date类型默认会补全时分秒并显示,所以看起来像是没生效。
内容的提问来源于stack exchange,提问作者bimonih260
相关产品推荐
相关产品推荐

