Свободный вложенный анализ JSON - PullRequest
0 голосов
/ 09 мая 2019

У меня есть журналы, подобные следующим:

{
  "log": {
    "header": {
      "key": "value",
      "nested": "{\"key1\":\"value\",\"key2\":\"value\"}",
      "dateTime": "2019-05-08T20:58:06+00:00"
    },
    "body": {
      "path": "/request/path/",
      "method": "POST",
      "ua": "curl/7.54.0",
      "resp": 200
    }
  }
}

Я пытаюсь объединить журналы, используя fluentd, и хочу, чтобы вся запись была в формате JSON.Конкретной проблемой является поле «$ .log.header.nested», представляющее собой строку JSON.Как я могу разобрать и заменить эту строку ее содержимым?

Для ясности, я бы хотел, чтобы выводимые журналами fluentd выглядели так:

{
  "log": {
    "header": {
      "key": "value",
      "nested": {
          "key1": "value",
          "key2": "value"
      },
      "dateTime": "2019-05-08T20:58:06+00:00"
    },
    "body": {
      "path": "/request/path/",
      "method": "POST",
      "ua": "curl/7.54.0",
      "resp": 200
    }
  }
}

Я нашел способпроанализировать вложенное поле как JSON, но сохранение до того же ключа, с которого оно было проанализировано, неясно.Похоже, что hash_value_field не поддерживает хранение во вложенном ключе.Есть ли другой способ сделать это?

1 Ответ

0 голосов
/ 13 мая 2019

Следующая конфигурация, кажется, выполняет то, что я хочу. Однако я не уверен, что это лучший способ. Я предполагаю, что использование ruby ​​гораздо менее производительно. Любые улучшения в этом приветствуются.

<filter logs>
  @type parser
  key_name "$.log.header.nested"
  hash_value_field "parsed_nested"
  reserve_data true
  remove_key_name_field true
  <parse>
    @type json
  </parse>
</filter>

<filter logs>
  @type record_transformer
  enable_ruby true
  <record>
    parsed_nested ${record["log"]["header"]["nested"] = record["parsed_nested"]}
  </record>
  remove_keys parsed_nested
</filter>
...