问题描述
正在尝试设置一个集中式的syslog,用于多个日志源。他在logstash中设置了两个独立的输入和两个独立的输出,但是其中一个输入的数据却出现在两个索引中。用户想知道自己做错了什么。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
在较早的版本中,可以使用标签和条件语句来实现这个目标。以下是一个示例配置文件:
input {
tcp {
port => 1525
codec => json_lines
tags => [ 'tcp' ]
}
file {
path => '/var/log/app.log'
codec => 'json'
tags => [ 'file' ]
}
}
output {
if 'file' in [tags] {
elasticsearch {
host => 'logstash-es'
index => 'files'
}
}
if 'tcp' in [tags] {
elasticsearch {
host => 'logstash-es'
index => 'tcp'
}
}
}
在上面的示例中,我们使用了标签和条件语句来将两个输入分别输出到两个不同的输出。通过在输入中设置标签,然后在输出中使用条件语句来判断标签,可以实现这个目标。
方案2
在较新的版本中,Logstash支持使用多个独立的管道文件来实现多个管道。以下是一个示例的pipelines.yml
文件:
- pipeline.id: tcp-inputs
path.config: '/etc/logstash/pipelines/tcp.cfg'
pipeline.workers: 3
- pipeline.id: file-inputs
path.config: '/etc/logstash/pipelines/files.cfg'
pipeline.workers: 2
在上面的示例中,我们定义了两个独立的管道,分别是tcp-inputs
和file-inputs
。每个管道都有自己的配置文件和工作线程数。这种方法更易于维护,因为每个管道都在单独的文件中,人们不需要在一个大文件中理解流程。
请注意,多个管道功能在Logstash 6.0及更高版本中可用。
以上是两种解决方案,根据你的版本和需求选择适合你的方法。
参考链接:
– Logstash 条件语句
– Logstash 多个管道
正文完