我在 Docker 容器中运行了几个 Spring Boot 应用程序。由于我不想登录到文件,我改为登录到控制台,然后使用logspout将日志转发到 Logstash。我正在使用logstash-logback-encoder以 JSON 格式记录来自应用程序的所有日志。
除此之外,还有一些日志(控制台输出)由 docker 容器在启动 Spring Boot 应用程序之前生成。这些不是 JSON 格式。
对于这两者,Logspout 在发送到 Logstash 之前会附加元数据(容器名称、容器 ID 等)。下面是我的两种格式的示例日志。
- 直接来自容器(无 JSON)
<14>1 2016-12-01T12:58:20Z 903c18d47759 com-test-myapp 31635 - - 设置活动配置文件进行测试
- 应用程序日志(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 日志?
谢谢,阿努普