You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

请求协助编写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_pathline_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:使用自定义模式文件(适合多场景复用)

  1. 在Logstash的patterns目录下创建一个自定义模式文件(比如custom_patterns),写入内容:
MY_RUNNER_LOG %{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel}(?: \[%{DATA:module}\])? %{DATA:file_path}:%{NUMBER:line_number} %{GREEDYDATA:message}
  1. 在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

火山引擎 最新活动