配置date match规则后Logstash处理nginx日志出现timestamp错误问题
问题根因
你遇到的日期解析错误是本地化参数(locale)与实际日志的月份语言不匹配导致的,具体问题出在两处配置:
- Logstash的
date过滤器配置了locale => "ru"(俄语),如果你的Nginx日志输出的月份是英文缩写(比如8月对应Aug),俄语环境下MMM格式符只会匹配俄语月份缩写(8月对应Авг),导致日期解析失败。如果你的Nginx本身是俄语环境输出俄语月份缩写,那问题就出在Elasticsearch的日期映射配置。 - Elasticsearch的自定义date映射没有指定本地化参数,默认使用英文locale解析日期值,当写入的日期字符串是俄语月份缩写时,ES无法正确识别,会 fallback 到默认的起始时间附近,就会出现实际是8月却解析成1月的问题。
修复步骤
根据你的实际日志的月份语言选择对应方案:
方案1:Nginx日志为英文月份缩写(绝大多数默认情况)
- 修改Logstash的date过滤器,把
locale => "ru"改为locale => "en" - 可选调整Elasticsearch的日期映射,显式指定locale避免兼容问题:
"timestamp" : { "type" : "date", "format":"dd/MMM/yyyy:HH:mm:ss Z", "locale": "en" }
方案2:Nginx日志为俄语月份缩写
- 保留Logstash的
locale => "ru"配置 - 修改Elasticsearch的日期映射,添加俄语本地化配置:
"timestamp" : { "type" : "date", "format":"dd/MMM/yyyy:HH:mm:ss Z", "locale": "ru" }
额外校验项
先确认你贴的grok规则里%{**HTTPDATE:timestamp**}的星号是排版时添加的格式符,如果实际配置里存在这两个星号要删掉,否则会导致grok匹配失败,timestamp字段无法正常提取。你也可以在Logstash配置中添加stdout { codec => rubydebug }输出,直接查看grok提取的timestamp原始字符串是否正确,快速排除匹配规则错误。
内容的提问来源于stack exchange,提问作者Mikhail
相关产品推荐
相关产品推荐

