Файлы журналов Symfony форматируются одинаково для всех сред. Это означает, что dev.log
оптимизирован для машин, а не для людей. В результате файл журнала переполнен бесполезной информацией, что снижает вашу продуктивность.
EasyLogHandler — это новый обработчик Monolog, который создает удобные для пользователя файлы журналов. Он оптимизирован для отображения информации журнала в четком и кратком виде. Используйте его в среде разработки, чтобы стать гораздо более продуктивным разработчиком.
Функции
Установка
Конфигурация и использование
Это некоторые из лучших функций EasyLogHandler и то, как он сравнивается с журналами Symfony по умолчанию.
Лог-файлы Symfony представляют собой огромный поток текста. Когда вы их открываете, вы не можете легко определить, когда запрос начался или закончился и какие сообщения журнала принадлежат друг другу:
Симфония | EasyLogHandler |
---|---|
EasyLogHandler структурирует файлы журналов по-другому:
Он добавляет большой заголовок и несколько новых строк для разделения журналов каждого запроса;
Если запрос менее важен (например, запросы Assetic), заголовок становится более компактным и отображает меньше информации;
Сообщения журнала разделены внутри, чтобы вы могли лучше понять их различные части (запрос, доктрина, безопасность и т. д.).
Прежде всего, EasyLogHandler не отображает временную метку в каждом сообщении журнала. В среде dev
вас это не должно волновать, поэтому временная метка отображается только один раз для каждой группы сообщений журнала.
Симфония | EasyLogHandler |
---|---|
extra
информация, которую включают в себя некоторые сообщения журнала для добавления более подробной информации о журнале, отображается только в том случае, если она отличается от предыдущего журнала. Напротив, Symfony всегда отображает extra
информацию для всех журналов, генерируя много дублированной информации:
Симфония |
---|
EasyLogHandler |
---|
Становится все более популярным использовать заполнители в сообщениях журнала вместо фактических значений (например, Matched route "{route}".
вместо Matched route "home".
Это отлично подходит для машин, поскольку они могут группировать похожие сообщения, которые различаются только значения заполнителя.
Однако для человека эта «особенность» настораживает. Вот почему EasyLogHandler автоматически заменяет любой заполнитель, включенный в сообщение журнала:
Симфония |
---|
EasyLogHandler |
---|
Важные элементы, такие как сообщения об устаревании и сообщения, связанные с безопасностью, должны выделяться в файлах журналов, чтобы их можно было мгновенно обнаружить. Однако в Symfony все логи выглядят одинаково. Как узнать, какие из них являются важными?
Симфония |
---|
(все сообщения выглядят одинаково) |
EasyLogHandler |
---|
(выделяются устаревания, предупреждения, ошибки и сообщения безопасности) |
Сообщения журнала обычно содержат связанные переменные в их context
и extra
свойства. Отображение содержимого этих переменных в файлах журналов всегда представляет собой трудный баланс между читабельностью и краткостью.
EasyLogHandler решает, как динамически встраивать эти переменные в зависимости от каждого сообщения журнала. Например, параметры запроса Doctrine всегда встроены, но параметры запроса встроены для неважных запросов и вложены для важных запросов:
Если сообщения журнала содержат следы стека ошибок, вам обязательно захочется их просмотреть. Однако Symfony отображает трассировки стека встроенными, что делает невозможным их проверку. EasyLogHandler отображает их как правильные трассировки стека:
Симфония |
---|
EasyLogHandler |
---|
Одним из наиболее неприятных моментов при проверке файлов журналов является наличие большого количества повторяющихся или похожих последовательных сообщений. Они предоставляют мало информации и просто отвлекают вас. EasyLogHandler обрабатывает все сообщения журнала одновременно, а не одно за другим, поэтому он распознает наличие похожих последовательных журналов.
Например, это файл журнала Symfony, отображающий три последовательных сообщения об отсутствующем переводе:
А вот как эти же сообщения отображает EasyLogHandler:
Разница еще более очевидна для сообщений с «уведомлением о событии», которые обычно генерируют десятки последовательных сообщений:
Симфония |
---|
EasyLogHandler |
---|
Этот проект распространяется как пакет PHP, а не пакет Symfony, поэтому вам просто нужно запросить проект с помощью Composer:
$ композитору требуется --dev easycorp/easy-log-handler
Определите в своем приложении новую службу для этого обработчика журнала:
Новая версия Symfony:
# config/packages/dev/easy_log_handler.yamlservices:EasyCorpEasyLogEasyLogHandler:public: falsearguments: ['%kernel.logs_dir%/%kernel.environment%.log']
Старая версия Symfony:
# app/config/services.ymlservices:# ...easycorp.easylog.handler:class: EasyCorpEasyLogEasyLogHandlerpublic: falsearguments: - '%kernel.logs_dir%/%kernel.environment%.log'
Обновите конфигурацию Monolog в среде dev
, чтобы определить буферизованный обработчик, который обертывает эту новую службу обработчика (продолжайте читать, чтобы понять, почему). Вы можете безопасно скопировать и вставить эту конфигурацию:
Новая версия Symfony:
# config/packages/dev/monolog.yamlmonolog:handlers:buffered:type: bufferhandler: easylogchannels: ['!event']level: debugeasylog:type: serviceid: EasyCorpEasyLogEasyLogHandler
Старая версия Symfony:
# app/config/config_dev.ymlmonolog:handlers:buffered:type: bufferhandler: easylogchannels: ["!event"]level: debugeasylog:type: serviceid: easycorp.easylog.handler
Большинство обработчиков журналов обрабатывают каждое сообщение журнала отдельно. Напротив, расширенная обработка журналов EasyLogHandler требует, чтобы каждое сообщение журнала было известно о других журналах (например, для объединения похожих последовательных сообщений). Это означает, что все журналы, связанные с запросом, должны собираться и обрабатываться в пакетном режиме.
В приведенной выше конфигурации buffered
обработчик сохраняет все сообщения журнала, а затем передает их обработчику EasyLog, который обрабатывает все сообщения одновременно и записывает результат в файл журнала.
Используйте обработчик buffered
для настройки регистрируемых/исключаемых каналов и уровня регистрируемых сообщений.