Logstash配置异常:Filebeat日志同时写入两个索引如何解决?
问题原因
Logstash会加载配置目录下的所有配置文件,并把所有输入、过滤、输出逻辑合并执行。你新增JSON文件的配置后,Logstash同时运行了两个输入(file和beats)、两组过滤、两组输出。不管是Filebeat发来的syslog,还是本地的JSON文件内容,都会经过所有过滤规则,然后被所有输出规则转发到对应的索引。
因为syslog的message字段不是JSON格式,JSON过滤规则不会对它做任何处理,但输出规则没做区分,所以Filebeat的日志既会被发送到filebeat-[日期]索引,也会被发送到json_data索引。
解决办法
有两种靠谱的解决方式:
方式一:给输出加条件判断
在两个配置的输出部分分别添加条件,让不同来源的日志只流向对应的索引:
修改JSON配置的输出段
output { # 只处理来自指定JSON文件的日志 if [source] == "/home/centos/json/test.json" { elasticsearch { hosts => "http://10.xxx.xxx.xxx:9200" index => "json_data" } } }
修改Beats配置的输出段
output { # 只处理Filebeat发来的日志 if [@metadata][beat] == "filebeat" { elasticsearch { hosts => "http://10.xxx.xxx.xxx:9200" sniffing => true manage_template => false index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}" } } }
这样就能保证两类日志各归其位,不会串索引。
方式二:用独立管道隔离配置
如果你的Logstash是5.0及以上版本,可以用Pipeline功能让两个配置完全独立运行,互不干扰:
- 在Logstash配置目录下创建
pipelines.yml(没有就新建),内容如下:
- pipeline.id: json_pipeline path.config: "/path/to/your/json_config_file.conf" - pipeline.id: beats_pipeline path.config: "/path/to/your/beats_config_file.conf"
- 把两个配置文件分别放到指定路径,重启Logstash后,两个管道会各自处理自己的输入、过滤和输出,不会出现日志串流的问题。
额外提示
- 改完配置可以用
logstash -f /path/to/config.conf --config.test_and_exit检查语法是否正确,避免重启出错。 - 也可以在输入阶段给日志加标签,比如在file输入里加
add_tag => ["json_log"],然后输出时用if "json_log" in [tags]判断,比依赖source字段更灵活。
内容的提问来源于stack exchange,提问作者tirullalleru
相关产品推荐
相关产品推荐

