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

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功能让两个配置完全独立运行,互不干扰:

  1. 在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"
  1. 把两个配置文件分别放到指定路径,重启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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 02:25:46