1

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

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

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

  1. 直接来自容器(无 JSON)

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

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

<14>1 2016-12-01T13:08:13Z 903c18d47759 com-test-myapp 31635 - - {"@timestamp":"2016-12-01T13:08:13.651+00:00","@version":1 ,"message":"这里有一些日志消息","logger_name":"com.test.myapp.MyClass","thread_name":"http-nio-8080-exec-1","level":"DEBUG" ,"level_value":10000,"HOSTNAME":"903c18d47759"}

下面是我的 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 中显示如下: 在此处输入图像描述

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

谢谢,阿努普

4

1 回答 1

2

问题出在%{DATA:jsonLog}零件上。DATA 模式.*?不是贪婪的(见这里),所以它不会抓取任何东西,也不会创建jsonLog字段。您需要改用该GREEDYDATA模式。

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

于 2016-12-01T16:23:29.533 回答