Logstash CSV输入日期解析错误求助:@timestamp不匹配ES索引格式
解决Logstash日期字段不符合Elasticsearch索引格式的问题
问题根源
你的输入日期为2024-01-09 22:21:04,Logstash的date过滤器处理后生成的@timestamp会包含纳秒(如2024-01-09T22:21:04.567414642Z),但你的Elasticsearch索引仅允许两种日期格式:
yyyy-MM-dd HH:mm:ssyyyy-MM-dd'T'HH:mm:ss.SSS'Z'
带纳秒的格式不在允许范围内,因此触发400解析错误。
解决方案
在Logstash的filter环节,通过Ruby过滤器手动将@timestamp格式化为符合索引要求的格式,以下是两种可行配置:
方案1:格式化为带三位毫秒的ISO格式(匹配索引要求的第二种格式)
在现有date过滤器后添加Ruby过滤器:
ruby { code => "event.set('@timestamp', event.get('@timestamp').to_time.strftime('%Y-%m-%dT%H:%M:%S.000Z'))" }
该配置会将日期统一格式化为2024-01-09T22:21:04.000Z,完全符合索引的yyyy-MM-dd'T'HH:mm:ss.SSS'Z'规则。
方案2:格式化为无毫秒的标准格式(匹配索引要求的第一种格式)
如果需要使用yyyy-MM-dd HH:mm:ss格式,可改用以下Ruby配置:
ruby { code => "event.set('@timestamp', event.get('@timestamp').to_time.strftime('%Y-%m-%d %H:%M:%S'))" }
修改后的完整filter配置示例
filter { csv { skip_empty_rows => "true" separator => "," columns => ['elastic_index_id', 'elastic_index_created_date', 'cart_received_timestamp', 'cart_item_id', 'cart_item_quantity', 'cart_item_description', 'cart_item_unit_price', 'cart_item_currency'] convert => { "cart_item_received_timestamp" => "date_time" "cart_item_updated_timestamp" => "date_time" "cart_received_timestamp" => "date_time" "elastic_index_created_date" => "date_time" "session_timestamp" => "date_time" } } date { match => ["cart_received_timestamp", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"] target => "@timestamp" } # 添加Ruby过滤器格式化日期 ruby { code => "event.set('@timestamp', event.get('@timestamp').to_time.strftime('%Y-%m-%dT%H:%M:%S.000Z'))" } mutate { remove_field => [["event"], "[type]", "[host]", "[message]", "[log]"] } }
额外说明
- 不建议修改Elasticsearch索引的日期格式(除非权限允许且无业务风险),因为你提到索引设置有严格校验。
- 之前尝试的
ISO8601格式匹配和convert转date_time无法解决问题,是因为Logstash内部的日期对象默认会保留纳秒精度,必须手动格式化截断。
内容的提问来源于stack exchange,提问作者Jason Gregory
相关产品推荐
相关产品推荐

