Logstash 6.1配置:如何为每个日志文件创建独立输入与索引
我尝试为每个输入日志文件创建独立索引,以下是我的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配置:
- 修改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"]
- 简化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]},不过其实没必要,因为已经通过条件判断区分了索引。
- 重启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

