2016-06-21 68 views
0

我正在使用symfony3應用程序的ELK堆棧記錄和分析我的日誌。 從symfony應用程序我想記錄可能有點深的jsons對象。 有沒有什麼辦法,基巴那解釋我的JSON作爲一個JSON而不是一個字符串?Symfony - ELK - 解釋json在Monolog中登錄

這裏是我正在登錄方式的一例,

$this->logger->notice('My log message', array(
    'foo'   => 'bar, 
    'myDeepJson1' => $deepJson1, 
    'myDeepJson2' => $deepJson2   
)); 

在那裏,我的logstash.conf。我用的symfony的模式,我發現這裏:https://github.com/eko/docker-symfony

input { 
    redis { 
     type  => "symfony" 
     db  => 1 
     key  => monolog 
     data_type => ['list'] 
     host  => "redis" 
     port  => 6379 
    } 
} 

filter { 
    if [type] == "symfony" { 
     grok { 
      patterns_dir => "./patterns" 
      match  => [ "message", "%{SYMFONY}" ] 
     } 
     date { 
      match => [ "date", "YYYY-MM-dd HH:mm:ss" ] 
     } 
     if [log_type] == "app" { 
      json { 
       source => "log_context" 
      } 
     } 
    } 
} 

output { 
    if [type] == "symfony" { 
     elasticsearch { 
      hosts => ["172.17.0.1:9201"] 
      index => "azureva-logstash" 
     } 
    } 
} 

其實,enverything即時記錄是在log_context變量,但獨白數組轉換成JSON,所以,我的$ deepJson變量是雙重編碼,但是,沒有辦法在上下文中記錄多維數組...

任何幫助,將不勝感激。謝謝 !

回答

0

從log_context獲取requestJson後,必須將所有「\」替換爲「以便能夠使用json插件解析它。
您可以使用mutate篩選器及其gsub選項(documentation)執行此操作。
然後你可以用json插件解析生成的json。

您可以更新您的文檔:

if [log_type] == "app" { 
    json { 
     source => "log_context" 
    } 
    mutate { 
     gsub => ["requestJson", "\\"", "\""] 
    } 
    json { 
     source => "requestJson" 
     target => "requestJsonDecode" 
    } 
} 
+0

參考:[JSON編解碼器(https://www.elastic.co/guide/en/logstash/2.2/plugins-codecs-json.html ) – baudsp

+0

嗨,謝謝你的回答,但是這並不能解決我的問題... json字符串沒有被解釋...我希望能夠像在表中一樣在json中導航...... Kibana仍然顯示爲原始json字段 – nikophil

+0

您可以在ES中添加一些日誌示例和您想要的內容嗎?它可以幫助我理解你的問題 – baudsp