You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Logstash Grok过滤器添加条件,区分Filebeat与Metricbeat日志

嗨,这个问题核心就是区分Filebeat和Metricbeat的日志流量,让Logstash只对前者应用Apache日志的Grok解析。咱们直接来改你的apache-filter.conf配置就行,思路是用条件判断把解析逻辑限定在Filebeat的日志上:

Beat系列(Filebeat/Metricbeat)默认会在日志里带上agent.type字段——Filebeat的是filebeat,Metricbeat的是metricbeat。咱们就用这个字段做判断,把所有Apache解析逻辑包在条件块里,这样Metricbeat的系统日志就会直接跳过这些filter,不会被解析。

修改后的完整apache-filter.conf示例如下:

filter {
  # 仅对Filebeat发送的日志应用Apache日志解析
  if [agent][type] == "filebeat" {
    # 优先匹配标准组合Apache日志格式
    grok {
      match => { "message" => "%{COMBINEDAPACHELOG}" }
      # 给解析失败的日志打标签,方便后续排查
      tag_on_failure => ["_grokparsefailure_apache"]
    }
    # 备用匹配:如果上面的COMBINED格式没匹配上,尝试提取客户端IP
    grok {
      match => { "message" => "%{IP:client}" }
      break_on_match => false  # 允许继续尝试下一个grok匹配
      tag_on_failure => ["_grokparsefailure_clientip"]
    }
    # 对提取到的client字段做GeoIP解析
    geoip {
      source => "client"
      target => "geoip"
      add_field => { "[geoip][coordinates]" => "%{[geoip][longitude]},%{[geoip][latitude]}" }
    }
  }
  # Metricbeat的日志会直接跳过上面的所有filter逻辑,流向output
}

额外优化建议(更精准匹配)

如果你的Filebeat还采集其他非Apache日志,建议在Filebeat的Apache输入配置里加个自定义字段,比如在Web服务器的filebeat.yml里:

filebeat.inputs:
- type: log
  paths:
    - /var/log/apache2/access.log  # 替换成你的Apache日志实际路径
  fields:
    log_type: apache
  fields_under_root: true  # 把自定义字段放到根级别,方便Logstash判断

然后把Logstash里的条件改成if [log_type] == "apache",这样就只会解析Filebeat里标记为Apache的日志,精准度更高。

验证步骤

  1. 先测试Logstash配置语法是否正确:
logstash -f /etc/logstash/conf.d/apache-filter.conf --config.test_and_exit
  1. 语法没问题的话,重启Logstash服务:
sudo systemctl restart logstash
  1. 去Kibana里查看索引,确认Metricbeat的系统日志没有出现Grok解析的字段(比如client、geoip),而Filebeat的Apache日志已经正确提取出这些字段就大功告成啦!

内容的提问来源于stack exchange,提问作者A. Kendall

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:36:55