日志忽略配置文件中的输入节

时间:2018-03-25 10:08:54

标签: logstash elastic-stack logstash-configuration

我有一个简单的设置,通过HTTP和TCP捕获日志。 我在/etc/logstash/conf.d/创建了两个配置文件(见下文),但通过HTTP发送的日志也通过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 }
}

关于我缺少什么的任何想法? 谢谢

2 个答案:

答案 0 :(得分:1)

输入,过滤器和输出配置即使在处理它时在logstash中分割不同的文件也会将其作为单个大配置进行处理,就好像在单个文件中指定了所有输入,过滤器和输出一样。

所以说进入logstash的事件将通过配置的所有输出和过滤插件,在你的情况下,TCP和HTTP输入插件拾取的每个事件都将通过http_logger中配置的过滤器插件和输出插件。 conf和tcp_logger.conf,这就是你在http-logger-*tcp-logger-*索引中隐藏事件的原因

因此,为了解决这个问题,我们可以为tcphttp输入插件选择的事件指定唯一的类型字段,然后有选择地使用类型中设置的类型应用过滤器和输出插件。输入插件如下所示

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 }
}

答案 1 :(得分:0)

@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"

管道现在单独运行:)

P.S。在此处进行任何更改后,请不要忘记重新加载logstash