You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:05:19