Система логирования Phact является небольшой оберткой над Monolog.
Система состоит из 3 основных частей:
- Логгер (
Logger
) - Обработчик (
Handler
) - Форматер (
Formatter
)
Логгер - это именованный канал для сообщений. Запись сообщений происходит непосредственно через логгер.
Каждое сообщение имеет свой уровень (это указатель на важность сообщения) и контекст (дополнительная информация к сообщению).
Уровни событий:
-
DEBUG - подробная отладочная информация
-
INFO - информация, полезные для понимания происходящего события (Например, авторизация пользователя, протокол взаимодействия с БД...)
-
NOTICE - отметка, важное событие
-
WARNING - предупреждение, нештатная ситуация, не являющаяся ошибкой (Например, использование устаревшего API, неверное использование API, нежелательные эффекты и ситуации, которые, тем не менее, не обязательно являются ошибочными)
-
ERROR - ошибка на стадии выполнения, не требующая неотложного вмешательства, но требующая протоколирования и дальнейшего изучения
-
CRITICAL - критическая ошибка, критическая ситуация (Например, недоступен компонент приложения, неожиданное исключение)
-
ALERT - тревога, меры должны быть предприняты незамедлительно (Например, весь веб-сайт недоступен, БД недоступна и т.д. вплоть до отправки SMS-сообщения ответственному лицу)
-
EMERGENCY - авария, система неработоспособна
Конфигурирование производится в компоненте log - раздел loggers. Опишем 2 логгера - my_logger и default:
...
'components' => [
...
'log' => [
...
'loggers' => [
'my_logger' => [
// Указываем класс логгера
'class' => \Monolog\Logger::class,
// Указываем обработчики (handlers) для нашего логгера
'handlers' => [
'default', 'my_handler'
]
],
'default' => [
// Указываем класс логгера
'class' => \Monolog\Logger::class,
// Указываем обработчики (handlers) для нашего логгера
'handlers' => [
'default'
]
]
]
...
]
...
]
...
Из конфигурации видно, что все сообщения, попадающие в логгер(канал) default будут попадать в обработчик default, а сообщения, попадающие в логгер(канал) my_logger будут попадать в 2 обработчика - default и my_handler
Обработчик определяет что делать с сообщением пришедшим из логгера. Он определяет поведение логгирования, например: вывести сообщение на экран, записать в файл или сокет.
Обработчик так же определяет уровень сообщения, с которого он начинает принимать сообщения. Например, если указать, что обработчик принимает сообщения не ниже уровня ERROR, то сообщения с уровнем WARNING и ниже он будет игнорировать, а с уровнем ERROR и выше - обрабатывать.
Конфигурирование производится в компоненте log - раздел handlers. Опишем 2 логгера - my_logger и default:
...
'components' => [
...
'log' => [
...
'handlers' => [
'my_handler' => [
// Указываем класс обработчика - в данном случае это обработчик, который отправляет сообщения в ротируемый лог-файл
'class' => \Monolog\Handler\RotatingFileHandler::class,
// Указываем аргументы конструктора обработчика
'__construct' => [
'/var/log/my.log', // Файл логов
7, // Максимальное количество файлов логов (старые будут автоматически удалены)
\Monolog\Logger::Logger::DEBUG // Минимальный уровень обрабатываемых сообщений
]
],
'default' => [
// Указываем класс обработчика
'class' => \Monolog\Handler\NativeMailerHandler::class,
// Указываем аргументы конструктора обработчика
'__construct' => [
'/var/log/my.log', // Файл логов
7, // Максимальное количество файлов логов (старые будут автоматически удалены)
\Monolog\Logger::Logger::DEBUG // Минимальный уровень обрабатываемых сообщений
],
'formatter' => 'extended_date'
]
]
...
]
...
]
...
Из конфигурации видно, что сообщения, попадающие в обработчик default, будут дополнительно отформатированы форматером extended_date, а сообщения, попадающие в обработчик my_handler, будут отформатированы форматером по-умолчанию.
Полный список доступных обработчиков можно посмотреть в пакете
\Monolog\Handlers
Форматеры определяют точный формат вывода сообщений.
Конфигурирование производится в компоненте log - раздел formatters. Опишем форматeр extended_date:
...
'components' => [
...
'log' => [
...
'formatters' => [
'extended_date' => [
// Указываем класс форматера
'class' => \Monolog\Handler\LineFormatter::class,
'__construct' => [
null // Основной формат вывода оставляем по-умолчанию
"Y-m-d H:i:s.u" // В формат вывода даты добавим микросекунды
]
]
]
...
]
...
]
...
Полный список доступных форматеров можно посмотреть в пакете
\Monolog\Formatter
Некоторые логгеры, форматеры и обработчики требуют дополнительных настроек после создания. Эти настройки можно установить через елемент конфигурации afterInit
.
Элемент конфигурации должен включать в себя замыкание, принимающее входящим параметром конфигурируемый объект.
Например, добавим для нашего обработчика my_handler вывод трассировки стека:
...
'components' => [
...
'log' => [
...
'handlers' => [
'my_handler' => [
'class' => \Monolog\Handler\RotatingFileHandler::class,
'__construct' => [
'/var/log/my.log',
7,
\Monolog\Logger::Logger::DEBUG
],
// Замыкание принимает входящим параметром объект обработчика
'afterInit' => function ($handler) {
// Устанавливаем необходимые настройки
$handler->includeStacktraces(true);
}
],
...
]
...
]
...
]
...
Отправка данных в логгер производится следующим образом:
// Получаем логгер по имени, если логгер с данным именем не найден, вернется логгер 'default'
$logger = Phact::app()->log->getLogger('my_logger');
// Логируем ошибку
$logger->error('Some error information', ['foo' => 'bar']);
// Логируем детальную информацию
$logger->debug('Some debug information');
// Или
// Логируем ошибку
Phact::app()->log->logError('Some error information', ['foo' => 'bar'], 'my_logger');
Также можно подключить trait Logger
к совоему классу и логировать события следующим образом:
...
class MyClass {
use Logger;
public function handle()
{
// Логируем ошибку
$this->logError('Some error information', ['foo' => 'bar'], 'my_logger');
}
}