Статьи

Ведение журнала с Monolog: от Devtools до Slack

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

большая партия документов в ожидании

Установка

Monolog доступен на Packagist, что означает, что вы можете установить его через Composer.

composer require 'monolog/monolog:1.13.*' 

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

Регистратор

Когда вы создаете новый регистратор, вы должны дать ему имя канала. Вот как вы отличаете свой список регистраторов. Я свяжу свой логгер с контейнером приложений.

 // app/bootstrap/container.php $logger =   new  \Monolog\Logger ( 'general' ); $app -> container -> logger =  $logger ; 

Поскольку Monolog — это PSR-3 , вы можете быть уверены, что придерживаетесь стандартов PHP-FIG. Это позволит вам переключиться на любую другую реализацию, если вы не чувствуете себя комфортно с Monolog (я не вижу причин, по которым вы этого не сделаете). Теперь вы можете начать ведение журнала одним из следующих способов, в зависимости от уровня вашего журнала . ( log , debug , info , warning , error , critical , alert , emergency ).

 $app -> container -> logger -> info ( "Just an INFO message." ); 

Обработчики

Когда вы регистрируете что-то, оно проходит список зарегистрированных обработчиков. Обработчик должен указать уровень журнала, который он будет обрабатывать, и статус пузыря, решающий, распространять сообщение или нет. Вы можете видеть, что мы не зарегистрировали никаких обработчиков для нашего регистратора. По умолчанию Monolog будет использовать \Monolog\Handler\StreamHandler для входа в стандартный вывод ошибок. Вы можете увидеть список доступных обработчиков в документации .

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

 // app/bootstrap/container.php $logger =   new  \Monolog\Logger ( 'general' ); $browserHanlder =   new  \Monolog\Handler\BrowserConsoleHandler ( \Monolog\Logger :: INFO ); $streamHandler =   new  \Monolog\Handler\StreamHandler ( 'php://stderr' ,  \Monolog\Logger :: ERROR ); $logger -> pushHandler ( $browserHanlder ); $logger -> pushHandler ( $streamHandler ); $app -> container -> logger =  $logger ; 
 // app/routes.php $app -> get ( '/admin/users' ,   function   ()   use   ( $app )   { $app -> container -> logger -> info ( "Another INFO message" ); $app -> container -> logger -> error ( "just another ERROR message" ); 
     // ... 
 }); 

Browser log

Stream log

Сообщение об ошибке было зарегистрировано на консоли терминала, как и ожидалось, но почему оно появляется на консоли браузера?
Это пузырчатая опция, которую обеспечивает Monolog. Сначала сообщение об ошибке было зарегистрировано в терминале, и, пока для параметра пузыривания установлено значение true, оно продолжит свой путь до вершины очереди обработчиков. Теперь давайте установим для параметра пузыря значение false в обработчике потока.

 // app/bootstrap/container.php 

 // ... $streamHandler =   new  \Monolog\Handler\StreamHandler ( 'php://stderr' ,  \Monolog\Logger :: ERROR ,   false ); 
 // ... 

Browser log

Stream log

Теперь вы можете видеть, что журнал ошибок не отображался на консоли браузера, и именно так вы можете разделить уровни журналов.

Вы также можете использовать внешние службы, такие как HipChat, Slack и т. Д., В качестве получателей сообщений. Давайте предположим, что у нас есть канал для разработчиков на Slack, и мы хотим, чтобы все знали, что произошла ошибка с необходимыми деталями.

Slack Handler

Перед отправкой обработчика Slack в очередь, вам нужно получить токен, чтобы дать обработчику разрешение на публикацию на ваш канал Slack. Перейдите на страницу авторизации и создайте новый токен.

 // app/bootstrap/container.php 

 // ... $slackHandler =   new  \Monolog\Handler\SlackHandler ( 'xoxp-5156076911-5156636951-6084570483-7b4fb8' ,   '#general' ,   'ChhiwatBot' ); $logger -> pushHandler ( $slackHandler ); 

 // ... 

Вам нужно только указать свой токен Slack и название канала, а третьим необязательным параметром является имя робота. Уровень журнала для Slack является CRITICAL , но вы можете изменить его, используя метод setLevel .

 $slackHandler -> setLevel ( \Monolog\Logger :: ERROR ); 

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

 $app -> container -> logger -> error ( "just an ERROR message" ); 

Slack log

Форматтеры

До сих пор все наши журналы были предварительно отформатированы, и у нас не было возможности указать формат регистрации. Это то, для чего нужны средства форматирования. Каждый обработчик имеет форматтер по умолчанию, и если вы не укажете его, вы получите LineFormatter . Для каждого форматера вы всегда можете переключиться на другой, например, HtmlFormatter . Некоторые обработчики имеют свои собственные форматеры, такие как ChromePHPHandler , LogglyHandler и т. Д.

 // app/bootstrap/container.php $browserHanlder =   new  \Monolog\Handler\BrowserConsoleHandler ( \Monolog\Logger :: INFO ); $browserHanlder -> setFormatter ( new  \Monolog\Formatter\HtmlFormatter ); 

 //... 

Теперь, когда вы регистрируете новое сообщение, оно будет отформатировано в HTML, а затем зарегистрировано в консоли браузера.

 $app -> container -> logger -> info ( "Another INFO message" ); 

Browser log

Вы также можете расширить LineFormatter чтобы включить более подробную информацию в сообщение. Доступные переменные:

  • message : сообщение журнала.
  • context : список данных, переданных при создании регистратора. ( new Logger('channelName', ['user' => 'adam']) ).
  • level : код level ошибки.
  • level_name : имя уровня ошибки.
  • channel : название канала регистратора.
  • datetime : текущая дата и время
  • extra : данные передаются препроцессорами.

Препроцессоры

Препроцессоры полезны для добавления более подробной информации в ваш журнал. Например, WebProcessor добавляет больше деталей о запросе, таких как ( url , ip и т. Д.). При создании вашего экземпляра регистратора вы устанавливаете список обработчиков и процессоров, но вы также можете использовать метод pushProcessor чтобы добавить их позже.

 // app/bootstrap/container.php $logger =   new  \Monolog\Logger ( 'general' ); $logger -> pushProcessor ( new  \Monolog\Processor\WebProcessor ); $browserHanlder =   new  \Monolog\Handler\BrowserConsoleHandler ( \Monolog\Logger :: INFO ); $logger -> pushHandler ( $browserHanlder ); 
 //... 

При регистрации чего-либо, запись журнала будет пропущена через список зарегистрированных процессоров, и вы получите что-то вроде следующего.

 $app -> container -> logger -> info ( "Another INFO message" ); 

Browser log

Monolog предоставляет список полезных препроцессоров для включения сведений о пиках памяти, идентификаторе пользователя и т. Д. Список доступных препроцессоров можно найти в документации .

Заворачивать

Monolog — одна из лучших доступных библиотек журналов, и она также интегрирована в большинство популярных фреймворков, таких как Symfony, Laravel, Silex, Slim и т. Д. Если у вас есть какие-либо комментарии или вопросы, вы можете опубликовать их ниже, и я буду сделать все возможное, чтобы ответить на них.