我正在设置一个通用的 Elasticsearch-Logstash-Kibana 堆栈,以部署到我的几个客户。我正在尝试模板化一些管道,以便我们只需根据需要为每个客户部署配置/管道。
Logstash 将input{...}
、filter{...}
和output{...}
称为部分及其内容作为插件,它们聚合为处理管道,每个管道都包含在一个文件中配置文件。
考虑到这一点,部分和管道是否有范围?也就是说,在特定配置文件中定义的部分是否使用仅有的通过该配置文件中的管道?
如果我有 2 个配置文件和 2 个管道:
# my_apache_pipeline.config
input {
tcp {
port 5000
}
}
filter {
if [application == "httpd"] {
...
}
}
output {
elasticsearch {
...
}
}
和
#my_nginx_pipeline.config
input {
tcp {
codec => "json"
port => 6000
}
}
filter {
if [application == "nginx"] {
...
}
}
output {
elasticsearch {
...
}
}
上述两个配置文件是否与下面单个配置文件创建相同的 2 个管道?
#my_merged_pipeline.config
input {
tcp {
codec => "json"
port => 6000
}
tcp {
port 5000
}
}
filter {
if [application == "nginx"] {
...
}
if [application == "httpd"] {
...
}
}
output {
elasticsearch {
...
}
}
也就是说,一组插件/部分位于哪个配置文件中以获取管道是否重要?或者input {...}
特定配置文件中的定义仅适用于该配置文件中的filter {...}
和?output {...}
答案1
据我了解它的工作方式,配置范围是全局的,并且给定部分(,,)的内容基本上input
都在“最终”配置中连接在一起。filter
output
因此,在您的示例中,是的,上面的两个管道将等同于下面的简化配置,唯一的区别在于您需要二 elasticsearch
输出,而不只是一个。我认为 LS 不够聪明,不知道它们是相同的。
我的建议是根据部分、功能和日志类型创建命名良好的文件:
#inputs
00-input-lumberjack.conf
01-input-syslog.conf
02-input-syslog_vmware.conf
#filters
11-filter-haproxy.conf
12-filter-lighttpd.conf
13-filter-syslog.conf
14-filter-proftpd.conf
15-filter-httpd.conf
17-filter-cron.conf
18-filter-yum.conf
88-filter-checksum.conf
89-filter-cleanup.conf
#outputs
97-output-kafka.conf
98-output-redis.conf
99-output-elasticsearch.conf
然后,您将运行 LS,并将-f
开关指向包含上述所有文件的文件夹。
这将确保它们按照特定顺序加载并且不会重复。
就我而言,过滤器和输出被if
“”包围,以检查类型/主机/文件/等,以确保给定部分仅适用于某些事件。
这还允许一些额外的事情。
- 通过将文件移动到子文件夹并重新启动 LS 来快速激活/停用部分
inactive
;它不会递归加载配置文件 - 处理带外的新日志类型,然后将新配置文件复制到目录并重新启动 LS