Назад | Перейти на главную страницу

Использование многострочного json в fluentd

Я новичок в fluentd.

У меня есть приложения, которые работают в контейнерах Docker. Это приложения Java, которые регистрируют в формате JSON. Сообщения JSON обычно разбиваются на несколько строк.

Я хотел бы использовать драйвер журнала Docker fluentd для отправки этих сообщений на центральный сервер fluentd.

Драйвер Docker отправляет каждую строку в fluentd отдельно, поэтому мне нужно объединить эти многострочные сообщения.

Я ищу советы о том, как этого добиться.

Используя стандартную конфигурацию fluentd, мои журналы выглядят так:

20170501T050820+0000    docker.fa5077070a33     {"log":"{\"timestamp\":\"2017-05-01T05:08:20.168Z\", \"applicationName\":\"my-event-publisher\", \"applicationVersion\":\"0.0.6-SNAPSHOT\",","container_id":"fa5077070a330f6a3a6f9400cc0ed04f2cf61c5eb2d66c5693385b67f3b09e2e","container_name":"/ecs-td-dev-my-event-publisher-12-my-event-publisher-dcb1b5f5a383d3852d00","source":"stdout"}
20170501T050820+0000    docker.fa5077070a33     {"container_name":"/ecs-td-dev-my-event-publisher-12-my-event-publisher-dcb1b5f5a383d3852d00","source":"stdout","log":"  \"logLevel\":\"INFO\", \"pid\":\"1\", \"threadId\":\"Thread-4\", \"host\":\"fa5077070a33\",","container_id":"fa5077070a330f6a3a6f9400cc0ed04f2cf61c5eb2d66c5693385b67f3b09e2e"}
20170501T050820+0000    docker.fa5077070a33     {"source":"stdout","log":"  \"logger\":\"org.springframework.context.support.DefaultLifecycleProcessor\",","container_id":"fa5077070a330f6a3a6f9400cc0ed04f2cf61c5eb2d66c5693385b67f3b09e2e","container_name":"/ecs-td-dev-my-event-publisher-12-my-event-publisher-dcb1b5f5a383d3852d00"}
20170501T050820+0000    docker.fa5077070a33     {"container_id":"fa5077070a330f6a3a6f9400cc0ed04f2cf61c5eb2d66c5693385b67f3b09e2e","container_name":"/ecs-td-dev-my-event-publisher-12-my-event-publisher-dcb1b5f5a383d3852d00","source":"stdout","log":"  \"message\":\"Stopping beans in phase 2147483647\""}
20170501T050820+0000    docker.fa5077070a33     {"source":"stdout","log":"}","container_id":"fa5077070a330f6a3a6f9400cc0ed04f2cf61c5eb2d66c5693385b67f3b09e2e","container_name":"/ecs-td-dev-my-event-publisher-12-my-event-publisher-dcb1b5f5a383d3852d00"}

В каком порядке мне подойти к этому?

Мне нужно:

  1. Извлеките часть журнала из каждой строки
  2. Найдите регулярное выражение / ^ {"timestamp /", чтобы определить начало сообщения.
  3. Объедините каждый из операторов журнала в один
  4. Разберите строку журнала в фактический JSON

Если честно, мне не очень важен формат fluentd - добавление метки времени и докера ..

Я бы предпочел просто иметь файл с моими сообщениями JSON без дополнительных полей, добавленных fluentd.

Я видел документацию по использованию «парсера», но, как я уже сказал, я просто не совсем уверен в порядке, поскольку я пытаюсь объединить многострочный JSON.