如何为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的日志,精准度更高。
验证步骤
- 先测试Logstash配置语法是否正确:
logstash -f /etc/logstash/conf.d/apache-filter.conf --config.test_and_exit
- 语法没问题的话,重启Logstash服务:
sudo systemctl restart logstash
- 去Kibana里查看索引,确认Metricbeat的系统日志没有出现Grok解析的字段(比如client、geoip),而Filebeat的Apache日志已经正确提取出这些字段就大功告成啦!
内容的提问来源于stack exchange,提问作者A. Kendall
相关产品推荐
相关产品推荐

