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

Logs are ignoring input section in config files

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

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

即使将输入、过滤器和输出配置拆分到不同的文件中,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 }
}

@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