我有一个通过HTTP和TCP捕获日志的简单设置。我已经在/etc/logstash/conf.d/
上创建了2个conf文件(见下文),但是通过TCP管道发送的日志也在传递,反之亦然。例如,当我通过TCP发送日志时,它会同时出现在http-logger-*
索引和tcp-logger-*
中。这对我来说毫无意义。
http_logger.conf
input {
http {
port => 9884
}
}
filter {
grok {
match => ["[headers][request_path]", "\/(?<component>[\w-]*)(?:\/)?(?<env>[\w-]*)(?:\/)?"]
}
}
output {
amazon_es {
hosts => ['XXXXX']
region => 'us-west-2'
aws_access_key_id => 'XXXXX'
aws_secret_access_key => 'XXXXX'
index => 'http-logger-%{+YYYY.MM.dd}'
}
stdout { codec => rubydebug }
}
tcp_logger.conf
input {
tcp {
port => 9885
codec => json
}
}
filter {
}
output {
amazon_es {
hosts => ['XXXXX']
region => 'us-west-2'
aws_access_key_id => 'XXXXX'
aws_secret_access_key => 'XXXXX'
index => 'tcp-logger-%{+YYYY.MM.dd}'
}
stdout { codec => rubydebug }
}
对我错过什么有什么想法吗?谢谢
发布于 2018-03-26 08:23:49
@Ram提供的解释是正确的,但是有一种解决这个问题的更干净的方法:输入pipelines.yml。
默认情况下,如下所示:
- pipeline.id: main
path.config: "/etc/logstash/conf.d/*.conf"
基本上,它加载并合并了所有的*.conf文件--在我的例子中,我有两个。
要解决这个问题,只需将管道分开,如下所示:
- pipeline.id: httplogger
path.config: "/etc/logstash/conf.d/http_logger.conf"
- pipeline.id: tcplogger
path.config: "/etc/logstash/conf.d/tcp_logger.conf"
这些管道现在分别运行:)
别忘了在这里做任何更改后再重新装上Don。
发布于 2018-03-25 23:57:23
输入、筛选和输出配置--即使分割到不同的文件-- logstash --在处理时,它将作为单个大配置来处理,就好像所有的输入、筛选和输出都指定在单个文件中一样。
所以说,进入logstash的事件将通过配置的所有输出和过滤器插件,在您的示例中,TCP和HTTP输入插件接收的每个事件都将通过http_logger.conf和tcp_logger.conf中配置的过滤器插件和输出插件,这就是为什么您看到事件同时存储在http-logger-*
和tcp-logger-*
索引中。
因此,为了解决这个问题,我们可以为tcp
和http
输入插件所选择的事件指定一个唯一的类型字段,然后使用输入插件中的类型集有选择地应用筛选器和输出插件,如下所示
http_logger.conf
input {
http {
port => 9884
type => "http_log"
}
}
filter {
if [type] == "http_log"
{
grok {
match => ["[headers][request_path]", "\/(?<component>[\w-]*)(?:\/)?(?<env>[\w-]*)(?:\/)?"]
}
}
}
output {
if ([type] == "http_log")
{
amazon_es {
hosts => ['XXXXX']
region => 'us-west-2'
aws_access_key_id => 'XXXXX'
aws_secret_access_key => 'XXXXX'
index => 'http-logger-%{+YYYY.MM.dd}'
}
}
stdout { codec => rubydebug }
}
tcp_logger.conf
input {
tcp {
port => 9885
codec => json
type => "tcp_log"
}
}
output {
if ([type] == "tcp_log")
{
amazon_es {
hosts => ['XXXXX']
region => 'us-west-2'
aws_access_key_id => 'XXXXX'
aws_secret_access_key => 'XXXXX'
index => 'tcp-logger-%{+YYYY.MM.dd}'
}
}
stdout { codec => rubydebug }
}
https://stackoverflow.com/questions/49474663
复制