我在Docker容器中運行了幾個Spring Boot應用程序。由於我不想登錄到文件,我將登錄到控制檯,然後使用logspout將日誌轉發到Logstash。我正在使用logstash-logback-encoder以JSON格式記錄應用程序中的所有日誌。無法使用Logstash中的grok提取包含JSON和非JSON數據混合的字段表單日誌行
除此之外,在啓動Spring Boot應用程序之前,還有一些由docker容器製作的日誌(控制檯輸出)。這些不是JSON格式。
對於這兩者,Logspout在發送到Logstash之前附加元數據(容器名稱,容器ID等)。以下是我的兩種格式的示例日誌。
- 從容器直接(無JSON)
< 14> 1 2016-12-01T12:58:20Z 903c18d47759 COM-測試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_VALUE級」:10000, 「主機名」: 「903c18d47759」}
下面是我Logstash神交配置。
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
感謝@baudsp的迴應。這確實是問題。 我現在可以解析JSON中的字段。但是,相同的模式適用於JSON和非JSON類型。下一步是我想出如何區分它們。謝謝你的幫助。 – Anoop
@Anoop很高興我能幫到你。 – baudsp
管理得到修復。我用一個單一的grok比賽創造了一個單一的領域。然後我使用相同的字段來解析JSON ..以下是相關的配置部分。 '神交{ 匹配=> { 「消息」=> [ 「<%{NUMBER:syslogPriority}> 1%{TIMESTAMP_ISO8601:eventTimestamp}%{BASE16NUM:數據筒}%{DATA:容器名稱}%{NUMBER: containerPort} - - %{GREEDYDATA:日誌}」, ] } } JSON { 源=> 「日誌」 目標=> 「parsedJson」 } 如果[parsedJson] { //將代碼從JSON解析字段 } ' – Anoop