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

如何将不同应用的日志拆分至各自Elasticsearch索引?

问题:无法将不同应用日志拆分到对应Elasticsearch索引

我正尝试将不同应用的日志拆分至各自对应的索引,以下是我的配置:

filebeat.yml

filebeat.inputs:
  - type: log
    enabled: true
    paths:
      - "/opt/logs/filebeat_test_1.log"
    fields:
      application: "APP_TEST_1"
      type: "logs1"
  - type: log
    enabled: true
    paths:
      - "/opt/logs/filebeat_test_2.log"
    fields:
      application: "APP_TEST_2"
      type: "logs2"
output.logstash:
  hosts: ["logstash:5044"]

logstash.conf

input {
  beats {
    port => 5044
  }
}
output {
  elasticsearch {
    hosts => "es-ingest:9200"
    index => "%{[fields.application]}-%{[beat.version]}-%{+yyyy.MM.dd}"
  }
}

但我并未得到预期的索引,请问这是将不同应用日志拆分至各自索引的正确方式吗?恳请帮助。


解答

你的整体思路是完全正确的——通过Filebeat给不同日志源打自定义字段标记,再在Logstash中根据这个字段动态生成Elasticsearch索引名,这是日志按应用拆分索引的标准实践之一。没得到预期结果,大概率是几个细节没处理到位,你可以按下面的步骤排查:

1. 先确认自定义字段是否被正确传递到Logstash

默认情况下,Filebeat的fields会被放在fields嵌套字段下(也就是[fields][application]),你在Logstash里用%{[fields.application]}的语法是没问题的,但可以先验证字段是否真的存在:

  • 在Logstash配置里临时添加一个stdout输出,查看完整事件结构:
output {
  stdout { codec => rubydebug } # 临时添加,用来打印事件详情
  elasticsearch {
    hosts => "es-ingest:9200"
    index => "%{[fields.application]}-%{[beat.version]}-%{+yyyy.MM.dd}"
  }
}

运行Logstash后,观察控制台输出,确认是否存在fields字段,以及application的值是否和你配置的一致。

2. 可选优化:开启fields_under_root简化字段路径

如果你想避免嵌套字段的麻烦,可以在Filebeat的每个input块里添加fields_under_root: true,这样自定义字段会直接放在事件顶层:

filebeat.inputs:
  - type: log
    enabled: true
    paths:
      - "/opt/logs/filebeat_test_1.log"
    fields:
      application: "APP_TEST_1"
      type: "logs1"
    fields_under_root: true # 新增此行
  - type: log
    enabled: true
    paths:
      - "/opt/logs/filebeat_test_2.log"
    fields:
      application: "APP_TEST_2"
      type: "logs2"
    fields_under_root: true # 新增此行

对应的Logstash索引配置可以改成更简洁的写法:

index => "%{application}-%{[beat.version]}-%{+yyyy.MM.dd}"

3. 检查Elasticsearch的权限与索引命名规则

  • 确保Logstash使用的账号拥有创建索引的权限(比如Elasticsearch的create_index权限),如果权限不足,日志会无法写入新索引。
  • 确认索引名符合Elasticsearch的命名规范:不能包含\、/、?、"、<、>、|、空格等特殊字符,你的APP_TEST_1这类命名是合法的,但如果实际应用名有特殊字符需要提前处理。

4. 验证Filebeat是否正常采集日志

查看Filebeat的日志(默认路径比如/var/log/filebeat/filebeat.log),确认它已经成功读取到目标日志文件的内容,并且没有出现连接Logstash失败的报错信息。

按上面的步骤排查后,应该就能解决索引拆分的问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:00:14