【问题标题】:Logs are ignoring input section in config files日志忽略配置文件中的输入部分
【发布时间】:2018-03-25 10:08:54
【问题描述】:

我有一个通过 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 elastic-stack logstash-configuration


    【解决方案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 }
    }
    

    【讨论】:

      【解决方案2】:

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

      管道现在单独运行:)

      附:不要忘记在此处进行任何更改后重新加载logstash

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-07
        • 1970-01-01
        • 2012-03-19
        • 1970-01-01
        • 1970-01-01
        • 2014-04-08
        • 2021-12-08
        • 1970-01-01
        相关资源
        最近更新 更多