基于Filebeat的source字段实现Logstash日志分流失败问题排查
问题定位与修复方案
当前配置展示
Filebeat配置截图

Logstash配置代码
input { beats { port => 5042 } } output { if [source] == "access" { elasticsearch { hosts => ["16.113.56.102:9200"] index => "logstsh-access-nginxlogs-%{+YYYY.MM.dd}" } } else if [source] == "error" { elasticsearch { hosts => ["16.113.56.102:9200"] index => "logstsh-error-nginxlogs-%{+YYYY.MM.dd}" } } }
核心问题
你在Filebeat里通过fields自定义的source字段,默认会被嵌套在fields节点下,而Logstash配置里直接用[source]匹配的是Filebeat自带的日志文件绝对路径字段(也就是你之前能正常工作的路径值),并非你自定义的access/error值。这就是分流规则失效的原因。
修复步骤
修正Logstash条件判断
将配置里的[source]替换为[fields][source],指向Filebeat自定义的字段:input { beats { port => 5042 } } output { if [fields][source] == "access" { elasticsearch { hosts => ["16.113.56.102:9200"] index => "logstsh-access-nginxlogs-%{+YYYY.MM.dd}" } } else if [fields][source] == "error" { elasticsearch { hosts => ["16.113.56.102:9200"] index => "logstsh-error-nginxlogs-%{+YYYY.MM.dd}" } } # 可选:添加默认输出,避免不符合条件的日志丢失 else { stdout { codec => rubydebug } } }验证字段结构(可选)
如果不确定字段位置,可以在Logstash的output里临时添加stdout输出,用rubydebug格式打印完整事件结构,确认自定义字段的位置:output { stdout { codec => rubydebug } # 保留原有ES输出配置 }检查Filebeat的
fields_under_root配置
如果你希望自定义字段直接放在根节点(不用嵌套在fields下),可以在Filebeat配置里添加:fields_under_root: true这种情况下Logstash里直接用
[source]就能匹配,但不推荐,容易和Filebeat自带字段冲突。
额外提示
注意你的索引名里有拼写错误:logstsh应该是logstash,建议修正避免后续索引管理问题。
内容的提问来源于stack exchange,提问作者ycwong
相关产品推荐
相关产品推荐

