同时使用Beats与File输入时Logstash+Filebeat配置异常求助
问题解决思路及步骤
核心问题:Logstash多配置文件合并引发的逻辑混乱
Logstash同时加载多个配置文件时,会将所有input、filter、output合并到同一个处理流程,而非独立运行。你的两个配置文件直接导致:
- Beats输入的事件会经过file配置里的grok过滤,同时输出到
systemsyslogs和numberlogtest两个索引 - File输入的事件也会流向两个索引,字段类型不匹配触发ES 400错误
- Logstash自身的file输入持续读取目标日志(仅在Filebeat中排除无效),加上重复处理导致CPU占用飙升
具体解决步骤
1. 隔离Logstash处理流程
要让两个配置独立运行,推荐在同一实例中用pipeline.id区分:
- Beats输入配置文件(如
beats-pipeline.conf):pipeline.id: beats-pipeline input { beats { port => 5044 } } filter { } output { if [@metadata][pipeline] { elasticsearch { hosts => ["localhost:9200"] manage_template => false index => "systemsyslogs" pipeline => "%{[@metadata][pipeline]}" } } else { elasticsearch { hosts => ["localhost:9200"] manage_template => false index => "systemsyslogs" } } } - File输入配置文件(如
file-pipeline.conf):pipeline.id: file-pipeline input { file { path => "/var/log/foldername/number.log" start_position => "beginning" sincedb_path => "/var/lib/logstash/sincedb-number" # 指定独立记录文件,避免重复读取 } } filter { grok { match => { "message" => "%{WORD:username} %{INT:number} %{TIMESTAMP_ISO8601:timestamp}" } } } output { elasticsearch { hosts => [ "localhost:9200" ] index => "numberlogtest" } }
修改Logstash的pipelines.yml,添加两个管道配置:
- pipeline.id: beats-pipeline path.config: "/etc/logstash/conf.d/beats-pipeline.conf" - pipeline.id: file-pipeline path.config: "/etc/logstash/conf.d/file-pipeline.conf"
2. 修复ES 400字段类型错误
报错Can't get text on a START_OBJECT是因为字段类型不匹配:比如service字段在numberlogtest索引中被映射为text类型,但Beats事件中的service是对象({"type"=>"system"})。
- 管道隔离后,Beats事件仅输出到
systemsyslogs,File输入事件仅输出到numberlogtest,不会再出现字段混输 - 若
numberlogtest索引已有错误映射,删除后重新创建:curl -X DELETE http://localhost:9200/numberlogtest
3. 终止日志重复读取
- 修正Filebeat排除规则:
exclude_files使用正则表达式,将原配置改为:exclude_files: - ^/var/log/foldername/.*\.log$ - 确保Logstash的file输入通过
sincedb_path记录读取位置,避免反复从头读取
验证步骤
- 重启Logstash和Filebeat服务
- 查看Logstash日志,确认无重复读取警告和ES 400错误
- 检查Elasticsearch两个索引,确认事件正常写入
- 监控CPU占用率,确认恢复正常
内容的提问来源于stack exchange,提问作者user12
相关产品推荐
相关产品推荐

