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

Logstash 6.1配置:如何为每个日志文件创建独立输入与索引

问题:为每个日志文件创建独立的Elasticsearch索引

我尝试为每个输入日志文件创建独立索引,以下是我的Logstash配置:

input {
  beats { port => "5044" }
  file{ path => "/home/centos/logs/mylogs.log" id => "mylog" }
  file{ path => "/home/centos/logs/syslog.log" id => "syslog" }
}
filter { }
output {
  if [id] == "mylog" {
    elasticsearch {
      hosts => [ "10.206.81.246:9200", "10.206.81.236:9200", "10.206.81.243:9200" ]
      user => "Test"
      password => "123456"
      index => "mylog-%{+YYYY.MM.dd}-%{id}"
    }
  } else if [id] == "syslog" {
    elasticsearch {
      hosts => [ "10.206.81.246:9200", "10.206.81.236:9200", "10.206.81.243:9200" ]
      user => "Test"
      password => "123456"
      index => "syslog-%{+YYYY.MM.dd}-%{id}"
    }
  }
}

我不清楚如何根据路径创建独立输入,尝试将%{id}替换为%{[id]}或%{+[id]}均无效,也试过使用type或tags,结果相同。生成的索引为mylog-2018.01.22-%{[id]}、mylog-2018.01.22-%{type}、mylog-2018.01.22-{id}。请问是否可以为每个日志文件创建独立索引?若可以,该如何配置?我查阅了相关文档但未解决问题。

补充:Kibana记录输出如下:
@timestamp January 22nd 2018, 10:04:40.799
@version 1
_id HwYcHWEB0LbLyxQz0EnW
_index syslog-2018.01.22
_score 2
_type doc
beat.hostname filebeat-prod-fileabeat1.myname.osdc1.company.local
beat.name filebeat-prod-fileabeat1.myname.osdc1.company.local
beat.version 6.1.1
bytes 138
client 12.4.14.27
duration 0.23
host filebeat-prod-fileabeat1.myname.osdc1.company.local
message 12.4.14.27 abcd /index.html 138 0.23
method abcd
offset 379,156
prospector.type log
request /index.html
source /home/centos/logs/mylogs.log
tags beats_input_codec_plain_applied


解决方案

兄弟,我一眼就看出问题所在了——你的日志根本不是通过Logstash的file输入进来的!从Kibana的输出能看到beat.hostname、beat.version这些字段,说明数据是Filebeat传输过来的,你在Logstash里给file输入设置的id字段完全没生效,自然找不到这个字段来替换索引名里的变量。

给你两种可行的解决办法,按需选择:

方法一:在Filebeat里标记日志源(推荐)

这种方法灵活性更高,后续改路径也不用动Logstash配置:

  1. 修改Filebeat的配置文件,给不同的日志文件添加自定义字段:
filebeat.prospectors:
- input_type: log
  paths:
    - /home/centos/logs/mylogs.log
  # 添加自定义字段标记日志源
  fields:
    log_source: mylog
- input_type: log
  paths:
    - /home/centos/logs/syslog.log
  fields:
    log_source: syslog

output.logstash:
  hosts: ["你的Logstash服务器地址:5044"]
  1. 简化Logstash配置,去掉没用的file输入,根据Filebeat传过来的fields.log_source字段分索引输出:
input {
  beats { port => "5044" }
}
filter { }
output {
  if [fields][log_source] == "mylog" {
    elasticsearch {
      hosts => [ "10.206.81.246:9200", "10.206.81.236:9200", "10.206.81.243:9200" ]
      user => "Test"
      password => "123456"
      index => "mylog-%{+YYYY.MM.dd}"
    }
  } else if [fields][log_source] == "syslog" {
    elasticsearch {
      hosts => [ "10.206.81.246:9200", "10.206.81.236:9200", "10.206.81.243:9200" ]
      user => "Test"
      password => "123456"
      index => "syslog-%{+YYYY.MM.dd}"
    }
  }
}

如果你非要在索引名里加标记,也可以写成mylog-%{+YYYY.MM.dd}-%{[fields][log_source]},不过其实没必要,因为已经通过条件判断区分了索引。

  1. 重启Filebeat和Logstash,新的日志就会自动分到对应的索引里了。

方法二:在Logstash里通过source字段判断

如果不想改Filebeat配置,也可以直接用Kibana里显示的source字段(就是日志文件的完整路径)来判断:

input {
  beats { port => "5044" }
}
filter { }
output {
  if [source] == "/home/centos/logs/mylogs.log" {
    elasticsearch {
      hosts => [ "10.206.81.246:9200", "10.206.81.236:9200", "10.206.81.243:9200" ]
      user => "Test"
      password => "123456"
      index => "mylog-%{+YYYY.MM.dd}"
    }
  } else if [source] == "/home/centos/logs/syslog.log" {
    elasticsearch {
      hosts => [ "10.206.81.246:9200", "10.206.81.236:9200", "10.206.81.243:9200" ]
      user => "Test"
      password => "123456"
      index => "syslog-%{+YYYY.MM.dd}"
    }
  }
}

这种方法不用动Filebeat,但如果以后日志文件路径变了,你得同步修改Logstash的配置,灵活性差一点。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:01:44