2016-12-01 26 views
1

我在Docker容器中運行了幾個Spring Boot應用程序。由於我不想登錄到文件,我將登錄到控制檯,然後使用logspout將日誌轉發到Logstash。我正在使用logstash-logback-encoder以JSON格式記錄應用程序中的所有日誌。無法使用Logstash中的grok提取包含JSON和非JSON數據混合的字段表單日誌行

除此之外,在啓動Spring Boot應用程序之前,還有一些由docker容器製作的日誌(控制檯輸出)。這些不是JSON格式。

對於這兩者,Logspout在發送到Logstash之前附加元數據(容器名稱,容器ID等)。以下是我的兩種格式的示例日誌。

  1. 從容器直接(無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如下: enter image description here

    我不知道我在這裏失蹤。我應該如何解決從JSON中提取字段?另外,grok過濾器是否正確處理JSON和非JSON日誌?

    感謝, Anoop

    回答

    2

    的問題是與%{DATA:jsonLog}部分。數據模式.*?不是貪婪的(見here),所以它不會獲取任何內容,也不會創建jsonLog字段。您需要改用GREEDYDATA模式。

    請參閱http://grokconstructor.appspot.com/do/match#result來測試您的模式。

    +0

    感謝@baudsp的迴應。這確實是問題。 我現在可以解析JSON中的字段。但是,相同的模式適用於JSON和非JSON類型。下一步是我想出如何區分它們。謝謝你的幫助。 – Anoop

    +0

    @Anoop很高興我能幫到你。 – baudsp

    +0

    管理得到修復。我用一個單一的grok比賽創造了一個單一的領域。然後我使用相同的字段來解析JSON ..以下是相關的配置部分。 '神交{ 匹配=> { 「消息」=> [ 「<%{NUMBER:syslogPriority}> 1%{TIMESTAMP_ISO8601:eventTimestamp}%{BASE16NUM:數據筒}%{DATA:容器名稱}%{NUMBER: containerPort} - - %{GREEDYDATA:日誌}」, ] } } JSON { 源=> 「日誌」 目標=> 「parsedJson」 } 如果[parsedJson] { //將代碼從JSON解析字段 } ' – Anoop

    相關問題