Групповые сообщения Symfony / Monolog - PullRequest
1 голос
/ 16 марта 2019

Вот так выглядит мой файл журнала после 2 запросов:

[2019-03-16 01:20:57] request.INFO: some stuff happened
[2019-03-16 01:20:57] request.INFO: some stuff happened
[2019-03-16 01:21:17] request.INFO: some stuff happened
[2019-03-16 01:21:17] request.INFO: some stuff happened

Есть ли способ группировать сообщения журнала по запросу, чтобы вы могли визуально увидеть, какие из них принадлежат друг другу? Это не должно быть фантазией. Даже новая строка будет делать:

[2019-03-16 01:20:57] request.INFO: some stuff happened
[2019-03-16 01:20:57] request.INFO: some stuff happened

[2019-03-16 01:21:17] request.INFO: some stuff happened
[2019-03-16 01:21:17] request.INFO: some stuff happened

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

Некоторые поиски дали удивительно мало информации. К сожалению, Monolog имеет несвязанную концепцию «группа», которая загромождает результаты поиска.

1 Ответ

1 голос
/ 18 марта 2019

Если я правильно понимаю, вы хотите иметь визуальный маркер в вашем файле журнала, который отмечает конец сообщений журнала запроса, верно?Самое простое решение, которое я могу себе представить, - регистрировать дополнительные сообщения в конце цикла запроса, например,

$logger->debug('----------------------------------------------------------');
$logger->debug('END OF REQUEST');
$logger->debug('----------------------------------------------------------');

. При использовании Symfony я бы добавил обработчик событий для kernel.finish_request или kernel.terminateкоторый вызывает регистратор.

Если вы хотите, чтобы дополнительные вызовы журнала не использовались в вашем коде начальной загрузки / обработки событий, вы можете написать свой собственный класс обработчика Monolog, который может обернуть другие обработчики (см. BufferHandler дляпример обработчика упаковки):

  • handle будет передавать сообщения обработчику с упаковкой.
  • handleBatch может прикрепить маркер к концу пакета перед его передачейна
  • close может также отправить последнее сообщение журнала обернутому хэдлеру перед вызовом его функции закрытия.Но close должен быть идемпотентным, так что это может создать проблему для этого случая.

Если ваши запросы долго выполняются и их сообщения смешиваются в файле журнала, добавьте BufferHandler вдержите их отдельно.

Если вы хотите удалить дополнительную информацию журнала (метка времени, источник, серьезность) перед маркером, я бы порекомендовал написать свой собственный форматер (перенос / создание подклассов LineFormatter), который дает разныевывод в зависимости от того, является ли сообщение журнала «сообщением о завершении» или нет.В этом случае я бы рекомендовал не отправлять несколько сообщений в качестве маркеров, а отправлять одно и определять формат маркера в форматере.

...