Logstash Grok解析失败求助:MongoDB输出格式配置问题
问题分析与解决提示
核心问题
出现_grokparsefailure的主要原因是错误地用grok插件执行字段添加/删除操作。grok的核心作用是文本解析匹配,若仅配置add_field或remove_field却未指定match规则,它会默认尝试匹配message字段,因无有效匹配规则导致解析失败,进而添加失败标签。此外,分散的grok解析块也存在冗余,增加了出错概率。
修正后的配置示例
filter { # 一次性解析所有核心字段,覆盖原message grok { match => { "message" => "%{LOGLEVEL:level}: %{YEAR:year}/%{MONTHNUM:month}/%{MONTHDAY:day} %{TIME:time} %{DATA:title}\.go:%{NUMBER:line}: %{GREEDYDATA:content}" } overwrite => [ "message" ] tag_on_failure => [] # 若存在格式异常日志,可根据需求调整是否保留失败标签 } # 用mutate插件拼接目标日期字段 mutate { add_field => { "date" => "%{year}-%{month}-%{day}T%{time}+09:00" } } # 用mutate插件清理冗余字段 mutate { remove_field => ["year", "month", "day", "time", "event", "@version", "agent", "host", "@timestamp", "ecs"] } }
关键修改说明
- 合并grok解析规则:把分散的多个grok块合并为一个,一次性解析出
level、year、month、day、time、title、line、content字段,减少解析步骤,降低出错概率。 - 替换字段操作插件:
mutate是Logstash专门用于字段增删改的工具,用它替代grok执行add_field和remove_field,从根源避免无匹配导致的失败标签。 - 失败标签可控:通过
tag_on_failure => []可关闭当前grok块的失败标签添加,若日志存在多种格式,可保留标签后续处理异常日志。
预期处理效果
修正后,文档将不再包含_grokparsefailure标签,最终结构如下:
{ "level": "ERROR", "title": "statistics_sales", "line": "136", "content": "sdb.FindUserByID, error: mongo: no documents in result", "date": "2022-08-16T13:27:42.292305+09:00", "log": { "offset": 575, "file": { "path": "/home/bjkang/LogCollector/Log/service_log_2022-08-23.log" } }, "input": { "type": "log" } }
内容的提问来源于stack exchange,提问作者BJKang
相关产品推荐
相关产品推荐

