Skip to content

Latest commit

 

History

History
228 lines (178 loc) · 10.6 KB

log.md

File metadata and controls

228 lines (178 loc) · 10.6 KB

Логирование

Описание

Система логирования Phact является небольшой оберткой над Monolog.

Система состоит из 3 основных частей:

  1. Логгер (Logger)
  2. Обработчик (Handler)
  3. Форматер (Formatter)

Логгер (Logger)

Логгер - это именованный канал для сообщений. Запись сообщений происходит непосредственно через логгер.

Каждое сообщение имеет свой уровень (это указатель на важность сообщения) и контекст (дополнительная информация к сообщению).

Уровни событий:

  • 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 для конфигурации объектов логгера

Некоторые логгеры, форматеры и обработчики требуют дополнительных настроек после создания. Эти настройки можно установить через елемент конфигурации 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');
    }
}