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

基于Filebeat的source字段实现Logstash日志分流失败问题排查

问题定位与修复方案

当前配置展示

Filebeat配置截图

Filebeat日志配置(使用fields定义source)

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值。这就是分流规则失效的原因。

修复步骤

  1. 修正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 }
      }
    }
    
  2. 验证字段结构(可选)
    如果不确定字段位置,可以在Logstash的output里临时添加stdout输出,用rubydebug格式打印完整事件结构,确认自定义字段的位置:

    output {
      stdout { codec => rubydebug }
      # 保留原有ES输出配置
    }
    
  3. 检查Filebeat的fields_under_root配置
    如果你希望自定义字段直接放在根节点(不用嵌套在fields下),可以在Filebeat配置里添加:

    fields_under_root: true
    

    这种情况下Logstash里直接用[source]就能匹配,但不推荐,容易和Filebeat自带字段冲突。

额外提示

注意你的索引名里有拼写错误:logstsh应该是logstash,建议修正避免后续索引管理问题。

内容的提问来源于stack exchange,提问作者ycwong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:02:03