Как разобрать GELF, диктующий принудительное добавление метки времени

Поэтому я использую logspout с плагином gelf (vincit/logspout-gelf) для вывода gelf в fluentd (td-agent). Fluentd настроен с помощью входного плагина gelf (MerlinDMC/fluent-plugin-input-gelf). Цель состоит в том, чтобы перехватить журналы докеров-контейнеров и отправить их на один сервер пересылки с одной точкой выхода с хоста EC2. Экспедитор уже с радостью собирает системные журналы хостов EC2 и добавляет правильную дату / время к каждому событию.

Когда я начинаю свободно говорить с этим конфигом, я пересылаю свои логи в Graylog, но формат времени неправильный (эпоха + время работы):

<source>
  type gelf
  protocol_type udp
  port 12202
  tag stuff
</source>

Зарегистрированное событие выглядит так:

1970-01-01 01:33:38 +0100 stuff: {"version":"1.1","host":"server1","short_message":"2018-02-09T16:07:25.546Z [access-log] ::ffff:1.2.3.4 - \"GET /find HTTP/1.1\" 200 5567 \"-\" \"ELB-HealthChecker/2.0\"1234","level":3,"image_id":"sha256:12345","image_name":"hello-world","container_id":"12345","container_name":"hello_world-task","command":"node bin/hello_world.js"}

Добавление небольшого форматирования добавляет правильную дату, но теряет все поля индексации:

format /^(?<time>[^ ]* [^ ]) (?<message>.)$/

Вывод теперь имеет правильную дату, но единственное проиндексированное поле - это, конечно, сообщение:

2018-02-09 16:14:45 +0000 stuff: {"message":"::ffff:1.2.3.4 - \\\"GET /find HTTP/1.1\\\" 200 5567 \\\"-\\\" \\\"ELB-HealthChecker/2.0\\\"1234\",\"timestamp\":\"2018-02-09T16:14:45.990867153Z\",\"level\":3,\"image_id\":\"sha256:12345\",\"image_name\":\"hello-world\",\"container_id\":\"12345\",\"container_name\":\"hello_world-task\",\"command\":\"node bin/hello_world.js\"}"}

Поэтому я думаю, что временная метка плагина "MerlinDMC/fluent-plugin-input-gelf" сломана, так как я могу проанализировать событие и проиндексировать поля.

Я начал пробовать это в Fluentular:

format /^\"\{\"version\"\,\:\"(?<version>\d{1}.\d{1})\"\,\"host\"\:\"(?<host>[^ ]*)\"\,\"short_message\"\:\"(?<short_message>.*)\"\,\"level\"\:(?<level>\d{1})\,\"image_id\"\:\"(?<image_id>.*)\"\,\"image_name\"\:\"(?<image_name>.*)\"\,\"container_id\"\:\"(?<container_id>.*)\"\,\"container_name\"\:\"(?<container_name>.*)\"\,\"command\"\:\"(?<command>.*)\"\}\"/
time_format %d/%b/%Y:%H:%M:%S %z

Это работает очень хорошо в "fluentular" и соответствует каждому полю правильно, но когда это помещено в fluentd:

2018-02-14 13:37:12 +0000 [warn]: pattern not match: "{\"version\":\"1.1\",\"host\":\"server1\",\"short_message\":\"2018-02-09T16:07:25.546Z [access-log] ::ffff:1.2.3.4 - \\"GET /find HTTP/1.1\\" 200 5567 \\"-\\" \\"ELB-HealthChecker/2.0\\"1234\",\"level\":3,\"image_id\":\"sha256:12345\",\"image_name\":\"hello-world\",\"container_id\":\"12345\",\"container_name\":\"hello_world-task\",\"command\":\"node bin/hello_world.js\"}"

Куда я иду не так?

0 ответов

Другие вопросы по тегам