Предварительная обработка сообщения, содержащего несколько записей журнала

TL;DR. Можно ли предварительно обработать сообщение, разделив его на новые строки, а затем, как обычно, каждое сообщение пройти через конвейер fluentd?

Я получаю эти сообщения журнала в fluentd:

2018-09-13 13:00:41.251048191 +0000 : {"message":"146 <190>1 2018-09-13T13:00:40.685591+00:00 host app web.1 - 13:00:40.685 request_id=40932fe8-cd7e-42e9-af24-13350159376d [info] Received GET /alerts\n"}
2018-09-13 13:00:41.337628343 +0000 : {"message":"199 <190>1 2018-09-13T13:00:40.872670+00:00 host app web.1 - 13:00:40.871 request_id=40932fe8-cd7e-42e9-af24-13350159376d [info] Processing with Api.AlertController.index/2 Pipelines: [:api]\n156 <190>1 2018-09-13T13:00:40.898316+00:00 host app web.1 - 13:00:40.894 request_id=40932fe8-cd7e-42e9-af24-13350159376d [info] Rendered \"index.json\" in 1.0ms\n155 <190>1 2018-09-13T13:00:40.898415+00:00 host app web.1 - 13:00:40.894 request_id=40932fe8-cd7e-42e9-af24-13350159376d [info] Sent 200 response in 209.70ms\n"}

Проблема с этими журналами заключается во втором сообщении: оно содержит несколько строк журнала приложений.

Это, к сожалению, то, с чем мне приходится иметь дело: система (привет, журналы Heroku!) Я работаю с журналами буферов, и выдает их как один блок, что делает невозможным узнать количество записей в блоке. авансом.

Это известное свойство Heroku. дренирование бревен.

Есть ли способ предварительно обработать сообщение журнала, чтобы получить непрерывный поток сообщений, которые будут нормально обрабатываться последующими средствами Fluent?

Вот как должен выглядеть постобработанный поток сообщений:

2018-09-13 13:00:41.251048191 +0000 : {"message":"146 <190>1 2018-09-13T13:00:40.685591+00:00 host app web.1 - 13:00:40.685 request_id=40932fe8-cd7e-42e9-af24-13350159376d [info] Received GET /alerts\n"}
2018-09-13 13:00:41.337628343 +0000 : {"message":"199 <190>1 2018-09-13T13:00:40.872670+00:00 host app web.1 - 13:00:40.871 request_id=40932fe8-cd7e-42e9-af24-13350159376d [info] Processing with Api.AlertController.index/2 Pipelines: [:api]\n"}
2018-09-13 13:00:41.337628343 +0000 : {"message":"156 <190>1 2018-09-13T13:00:40.898316+00:00 host app web.1 - 13:00:40.894 request_id=40932fe8-cd7e-42e9-af24-13350159376d [info] Rendered \"index.json\" in 1.0ms\n"}
2018-09-13 13:00:41.337628343 +0000 : {"message":"155 <190>1 2018-09-13T13:00:40.898415+00:00 host app web.1 - 13:00:40.894 request_id=40932fe8-cd7e-42e9-af24-13350159376d [info] Sent 200 response in 209.70ms\n"}

P.S. Моя текущая конфигурация очень проста, но я публикую ее на всякий случай. Все, что я пытаюсь сделать, это понять, возможна ли в принципе предварительная обработка сообщения?

<source>
  @type http
  port 5140
  bind 0.0.0.0

  <parse>
    @type none
  </parse>
</source>

<filter **>
  @type stdout
</filter>

person gmile    schedule 13.09.2018    source источник


Ответы (1)


Как насчет https://github.com/hakobera/fluent-plugin-heroku-syslog< /а> ?

fluent-plugin-heroku-syslog не поддерживается 4 года назад, но он будет работать с Fluentd v1 с использованием совместимого уровня.

person okkez    schedule 14.09.2018
comment
Хорошая находка, спасибо! Не могли бы вы рассказать о слое совместимости? - person gmile; 14.09.2018
comment
Забыл вернуться к вам. Я обновил fluent-plugin-heroku-syslog, чтобы он был совместим с 1.2.5 (хотя я обновил только часть https syslog). Я еще не опубликовал его, хотя. Я собираюсь принять ответ. Спасибо, что указали мне правильное направление! - person gmile; 25.09.2018