Filebeat按输入设置Elasticsearch索引名失效问题排查
问题根源与解决方案
问题核心
Filebeat输入段的index参数仅在Filebeat直接输出到Elasticsearch时生效。当你将日志输出到Logstash时,这个配置不会被自动传递到Logstash的元数据或字段中,Logstash完全读取不到这个值,自然无法用它来生成目标索引。而你把index移到output.logstash段时生效,是因为这个全局配置会把索引名写入[@metadata][index]传递给Logstash,但这种方式只能给所有输入设置同一个索引,不符合你多输入分索引的需求。
解决方案
步骤1:修改Filebeat配置,给每个输入添加专属索引标识
推荐用[@metadata]字段传递(不会污染业务日志字段),针对每个输入添加处理器注入元数据:
filebeat.inputs: - type: filestream id: "filestream-id" enabled: true paths: - /usr/share/filebeat/logs/*.log fields_under_root: true processors: - dissect: tokenizer: "/usr/share/filebeat/logs/%{service_name}.log" field: "log.file.path" target_prefix: "" # 给当前输入添加专属索引标识到元数据 - add_fields: target: "@metadata" fields: target_index: "index-id" output.logstash: hosts: [ "loghost:5044" ]
后续添加新输入时,只需在对应input块下添加相同的add_fields处理器,修改target_index的值即可。
步骤2:修改Logstash配置,读取传递的索引标识生成目标索引
修改Logstash的elasticsearch输出段,替换索引模板为读取Filebeat传来的元数据:
input { beats { port => 5044 codec => "json" } } filter { mutate { remove_field => ["[event][original]"] } } output { elasticsearch { # 用Filebeat传递的元数据作为索引前缀 index => "%{[@metadata][target_index]}-%{+YYYY.MM.dd}" hosts=> "${ELASTIC_HOSTS}" user=> "${ELASTIC_USER}" password=> "${ELASTIC_PASSWORD}" cacert=> "certs/ca/ca.crt" } stdout { codec => rubydebug } }
步骤3:验证配置
- 重启Filebeat和Logstash服务
- 查看Logstash标准输出,确认
[@metadata][target_index]字段存在且值正确 - 登录Elasticsearch查看索引,确认生成了以
index-id-YYYY.MM.dd命名的索引
内容的提问来源于stack exchange,提问作者daniu
相关产品推荐
相关产品推荐

