无法使用Logstash

时间:2016-12-01 13:55:50

标签: logstash logstash-grok logstash-logback-encoder

我在Docker容器中运行了几个Spring Boot应用程序。由于我不想记录到文件,因此我将登录到控制台,然后使用logspout将日志转发到Logstash。我使用logstash-logback-encoder以JSON格式记录应用程序中的所有日志。

除此之外,还有一些日志(控制台输出)由docker容器在启动Spring Boot应用程序之前生成。这些不是JSON格式。

对于这两者,Logspout在发送到Logstash之前附加元数据(容器名称,容器ID等)。以下是两种格式的示例日志。

  1. 直接从容器(无JSON)
  2.   

    < 14> 1 2016-12-01T12:58:20Z 903c18d47759 com-test-myapp 31635    - - 设置活动配置文件以进行测试

    1. 应用程序日志(采用JSON格式)
    2.   

      < 14> 1 2016-12-01T13:08:13Z 903c18d47759 com-test-myapp 31635    - {" @ timestamp":" 2016-12-01T13:08:13.651 + 00:00"," @ version":1,"消息":"一些   日志消息去   这里"" logger_name":" com.test.myapp.MyClass"" THREAD_NAME":" HTTP-NIO-8080-exec- 1""电平":" DEBUG"" LEVEL_VALUE":10000" HOSTNAME":" 903c18d47759&#34 ;}

      下面是我的Logstash grok配置。

      input {
        tcp {
          port => 5000
          type => "logspout-syslog-tcp"
        }
      }
      filter {
        if [type] == "logspout-syslog-tcp" {
          grok {
            match => {
              "message" => [
                "<%{NUMBER:syslogPriority}>1 %{TIMESTAMP_ISO8601:eventTimestamp} %{BASE16NUM:containerId} %{DATA:containerName} %{NUMBER:containerPort} - - %{DATA:jsonLog}",
                "<%{NUMBER:syslogPriority}>1 %{TIMESTAMP_ISO8601:eventTimestamp} %{BASE16NUM:containerId} %{DATA:containerName} %{NUMBER:containerPort} - - %{DATA:regularLog}"
              ]
            }
          }
      
          json {
              source => "jsonLog"
              target => "parsedJson"
              remove_field=>["jsonLog"]
          }
      
          mutate {
            add_field => {
              "level" => "%{[parsedJson][level]}"
              "thread" => "%{[parsedJson][thread_name]}"
              "logger" => "%{[parsedJson][logger_name]}"
              "message" => ["%{[parsedJson][message]}"]
            }
          }
        }
      }
      output {
        elasticsearch { hosts => ["localhost:9200"] }
        stdout { codec => rubydebug }
      }
      

      基于此,我希望将JSON中的每个字段作为Elasticsearch / Kibana中的过滤器提供。但我无法获得这些领域的价值。它出现在Kibana如下: enter image description here

      我不确定我在这里缺少什么。我该如何从JSON中提取字段?此外,grok过滤器是否正确处理JSON和非JSON日志?

      谢谢, Anoop

1 个答案:

答案 0 :(得分:2)

问题在于%{DATA:jsonLog}部分。 DATA模式.*?并不贪婪(请参阅here),因此它不会抓取任何内容,也不会创建jsonLog字段。您需要使用GREEDYDATA模式。

请参阅http://grokconstructor.appspot.com/do/match#result以测试您的模式。