2017-02-01 44 views
1

內JSON我有些JSON正在從碼頭工人容器經由FluentD駕駛員等發出的?當該數據是通過fluentD捕獲,它結束了看起來像這樣,如所預期:解析內部FluentD

2017-02-01 06:29:15 +0000 docker.6faad650faa6: {"log":"{\"timeMillis\":1485917543709,\"thread\":\"main\",\"level\":\"INFO\",\"loggerName\":\"com.imageintelligence.ava.api.Boot\",\"message\":\"{\\\"dom\\\":\\\"DOM\\\"}\",\"loggerFqcn\":\"org.apache.logging.slf4j.Log4jLogger\",\"threadId\":1,\"threadPriority\":5}\r","com.amazonaws.ecs.cluster":"dombou","container_id":"6faad650faa6012af4f32df79901b42488543a5e6e53517fe3579b01ab2b6862","container_name":"/upbeat_booth","source":"stdout"}` 

我使用過濾器像這樣,解析JSON:

<filter docker.**> 
    @type parser 
    format json 
    key_name log 
    reserve_data true 
    hash_value_field log 
</filter> 

和我結束了半-sanitized JSON:

2017-02-01 06:32:10 +0000 docker.68c794f7f694: {"source":"stdout","log":{"timeMillis":1485917543709,"thread":"main","level":"INFO","loggerName":"com.imageintelligence.ava.api.Boot","message":"{\"dom\":\"DOM\"}","loggerFqcn":"org.apache.logging.slf4j.Log4jLogger","threadId":1,"threadPriority":5},"com.amazonaws.ecs.cluster":"dombou","container_id":"68c794f7f6948d4261b9497947834651abbf766e9aa51a76f39d6895b7a9ac18","container_name":"/sad_hamilton"} 

的問題是,在message領域仍然是一個字符串逃過JSON場。關於如何解析內部JSON字段的任何建議?我如何堆疊過濾器?

回答

0

請嘗試以下插件,讓我知道如何去:

https://github.com/edsiper/fluent-plugin-docker

+0

我的理解是,這適用於'日誌'字段,但沒有內部日誌字段。我需要一些能夠遞歸處理日誌內部的東西。我會試一試雖然 –

+0

確認:它不會解析內部的json,因爲我想 –

0

你可以嘗試連續的過濾器:

<filter docker.**> 
    @type parser 
    key_name log 
    format json 
    reserve_data true 
</filter> 

<filter docker.*.embeded_json.**> 
    @type parser 
    key_name message 
    format json 
    reserve_data true 
</filter> 
0

定義的過濾器,並使用json_in_json撐着了fluentd。在此過濾器之後,爲此過濾器定義匹配器,以便在日誌中執行進一步的過程。

這就是幫助你解析嵌套的json。如果它尚不存在,U可能還需要添加 gem install fluent-plugin-json-in-json。 參考 - https://github.com/gmr/fluent-plugin-json-in-json