我在Docker容器中运行了几个Spring Boot应用程序。由于我不想记录到文件,因此我将登录到控制台,然后使用logspout将日志转发到Logstash。我使用logstash-logback-encoder以JSON格式记录应用程序中的所有日志。
除此之外,还有一些日志(控制台输出)由docker容器在启动Spring Boot应用程序之前生成。这些不是JSON格式。
对于这两者,Logspout在发送到Logstash之前附加元数据(容器名称,容器ID等)。以下是两种格式的示例日志。
< 14> 1 2016-12-01T12:58:20Z 903c18d47759 com-test-myapp 31635 - - 设置活动配置文件以进行测试
< 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如下:
我不确定我在这里缺少什么。我该如何从JSON中提取字段?此外,grok过滤器是否正确处理JSON和非JSON日志?
谢谢, Anoop
答案 0 :(得分:2)
问题在于%{DATA:jsonLog}
部分。 DATA模式.*?
并不贪婪(请参阅here),因此它不会抓取任何内容,也不会创建jsonLog
字段。您需要使用GREEDYDATA
模式。
请参阅http://grokconstructor.appspot.com/do/match#result以测试您的模式。