2017-02-01 17 views
1

Я некоторые JSON, излучаемый из DOCKER контейнера через драйвер FluentD как:Синтаксический внутренний JSON внутри FluentD

'{"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}' 

Обратите внимание на message поле строки закодированного в формате JSON? Когда эти данные захвачены 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 pluggin для fluentd. После этого фильтра определите совпадение для этого фильтра, чтобы продолжить процесс в вашем журнале.

Thats поможет вам разобрать вложенный json. U также может потребоваться добавить gem install fluent-plugin-json-in-json, если он еще не присутствует. Refer - https://github.com/gmr/fluent-plugin-json-in-json