请求协助编写Logstash中过滤Apache错误日志的Grok模式
自定义Grok模式匹配你的日志格式
看起来你遇到的问题是自带的Apache Grok模式和你的日志格式不匹配——其实你的日志更像是Logstash/Filebeat这类数据采集工具的运行日志,而非标准Apache Web服务器的错误日志,所以需要自定义Grok模式来适配。
先分析你的日志结构
从你给出的示例日志来看,主要有两种格式变体:
2020-10-07T01:21:26.403-0400 ERROR [reload] cfgfile/list.go:96 Error creating runner from config: ...
2020-10-07T01:21:38.925-0400 INFO pipeline/output.go:93 Attempting to reconnect to ...
可以拆解出以下核心字段:
- 带时区的ISO8601标准时间戳
- 日志级别(ERROR/INFO)
- 可选的模块标签(比如
[reload]、[publish]) - 代码文件路径+行号(比如
cfgfile/list.go:96) - 具体的日志描述消息
自定义Grok匹配模式
针对你的日志格式,我整理了一个精准的Grok模式:
%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel}(?: \[%{DATA:module}\])? %{DATA:file_path}:%{NUMBER:line_number} %{GREEDYDATA:message}
模式字段解释:
%{TIMESTAMP_ISO8601:timestamp}:匹配你的ISO8601格式时间戳,自动映射为timestamp字段%{LOGLEVEL:loglevel}:匹配ERROR/INFO这类日志级别,映射为loglevel字段(?: \[%{DATA:module}\])?:?:表示非捕获组,?标记该部分为可选,匹配[reload]这类模块标签,映射为module字段%{DATA:file_path}:%{NUMBER:line_number}:拆分代码文件路径和行号,分别映射为file_path和line_number字段%{GREEDYDATA:message}:匹配剩余的所有日志内容,映射为message字段
在Logstash中应用的两种方式
方式1:直接写入配置文件
在你的Logstash配置的filter块中添加grok插件即可:
filter { grok { match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel}(?: \[%{DATA:module}\])? %{DATA:file_path}:%{NUMBER:line_number} %{GREEDYDATA:message}" } # 可选:匹配失败时标记日志,方便后续排查 tag_on_failure => ["_grokparsefailure"] } # 可选:将解析出的timestamp转换为Logstash标准的@timestamp字段 date { match => ["timestamp", "ISO8601"] target => "@timestamp" } }
方式2:使用自定义模式文件(适合多场景复用)
- 在Logstash的
patterns目录下创建一个自定义模式文件(比如custom_patterns),写入内容:
MY_RUNNER_LOG %{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel}(?: \[%{DATA:module}\])? %{DATA:file_path}:%{NUMBER:line_number} %{GREEDYDATA:message}
- 在Logstash配置中引用该模式:
filter { grok { patterns_dir => ["/path/to/your/logstash/patterns"] # 替换为你的patterns目录实际路径 match => { "message" => "%{MY_RUNNER_LOG}" } tag_on_failure => ["_grokparsefailure"] } date { match => ["timestamp", "ISO8601"] target => "@timestamp" } }
验证配置的小技巧
你可以用Logstash自带的命令快速验证配置是否正确:
bin/logstash -f your_config.conf --config.test_and_exit
也可以实时测试日志解析效果:
bin/logstash -f your_config.conf -e 'input { stdin {} } output { stdout { codec => rubydebug } }'
运行后粘贴你的日志内容,就能看到结构化后的字段输出了。
内容的提问来源于stack exchange,提问作者Tech Geek




