Логирование в PHP с помощью Zend Log
В каждом реальном PHP приложений время от времени возникают ошибки и исключения, выскакивают предупреждения, сообщения. Если мы не будим записывать эту информацию (логировать), то в один прекрасный момент станет невозможным понять, в какой же части приложения возникают эти ошибки и исключения, и, соответственно, не сможем решить их. К тому же, существуют такие ситуации, когда логирование событий, действий просто необходимо, как в случае, с входом пользователя в систему и выходом из нее, например.
В PHP уже существуют необходимые средства для журналирования: функция error_log() – для отправки сообщения в системный журнал, функция set_error_handler(), для перехвата предупреждений и ошибок. Эти функции могут быть использованы для пользовательского управления ошибками, давая разработчику кода возможность самостоятельного управления логикой обработки и фильтрации ошибок.
Однако такой низкоуровневый доступ приводит к частому дублированию кода, и что еще более важно, такой код более подвержен ошибкам. Поэтому на помощь программисту приходят уже готовые компоненты, хорошо протестированные и зарекомендовавшие себя в “боевых” условиях.
К таким компонентам относится компонент zend-log из фреймворка Zend. Компонент zend-log может быть использован в качестве многоцелевого компонента логирования, эдакий мастер на все руки. Он поддерживает множество форматов журнальных сообщений и разновидностей баз логирования (файлы, базы данных), плюс ко всему имеет проработанную систему фильтрации сообщений и много чего еще. Также zend-log совместим с PSR-3 стандартом логирования. Устанавливается так:
сomposer require zendframework/zend-log
Используется следующим образом (для примера используется файл index.php в корне проекта):
<?php
require 'vendor/autoload.php';
use Zend\Log\Logger;
use Zend\Log\Writer\Stream;
$logger = new Logger;
// отправляем ошибки в консоль
$writer = new Stream('php://ouput');
$logger -> addWriter($writer);
$logger -> log(Logger::INFO,'Некая информация');
?>
Результат выполнения кода выше:
2017-09-26T10:40:34+03:00 INFO(6): Некая информация
Итоговая строка включает время события, приоритет и сообщение. Формат выводимого сообщения, безусловно, может быть изменен, в случае необходимости с помощью метода setFormatter(). По умолчанию, строка лога описывается следующим шаблоном:
%timestamp% %priorityName% (%priority%): %message% %extra%
- %timestamp% - это метка времени
- %priorityName% - текстовая метка приоритета
- %priority% - числовая метка приоритета
- %message% - сообщение
- %extra% - необязательное значение для дополнительной информации
Если Вы захотите изменить формат сообщения, то это делается следующим образом:
<?php
$formatter = new Zend\Log\Formatter\Simple('сообщение %message%' . PHP_EOL);
$writer -> setFormatter($formatter);
?>
Компонент zend-log может быть также использован для логирования ошибок и исключений самого интерпретатора PHP. Для этого в классе Logger существую два статических метода: Logger::registerErrorHandler($logger) – для перехвата ошибок и Logger::registerExceptionHandler($logger) - для перехвата исключений.
<?php
use Zend\Log\Logger;
use Zend\Log\Writer;
$logger = new Logger;
$writer = new Writer\Stream(__DIR__ . '/test.log');
$logger->addWriter($writer);
// Логировать ошибки
Logger::registerErrorHandler($logger);
// Логировать исключения
Logger::registerExceptionHandler($logger);
?>
Как упоминалось ранее, zend-log предоставляет нам возможность фильтрации сообщений для логирования, т.е. перед тем как записать сообщение в лог, мы может посмотреть удовлетворяет ли оно нашим критериям, и если да, то записываем.
Вот пример:
<?php
$filter = new Zend\Log\Filter\Priority(Logger::CRIT);
// метод addFilter интерфейса Writer
$writer->addFilter($filter);
?>
В данном примере, мы будем логировать только те сообщения, чей приоритет меньше или равен критическому (Logger::CRIT).
Полный список приоритетов, определенных в классе Zend\Log\Logger:
<?php
const EMERG = 0; // Авария: система непригодна для использования
const ALERT = 1; // Тревога: срочно необходимо принимать меры
const CRIT = 2; // Критическая ситуация
const ERR = 3; // Ошибка
const WARN = 4; // Предупреждение
const NOTICE = 5; // Внимание
const INFO = 6; // Информация
const DEBUG = 7; // Дебаг, отладка
?>
Мы также можем фильтровать сообщения на основе регулярных выражений, временных меток и т.д. Таким образом, логирование в PHP – это важная и порой необходимая вещь при разработке web-приложений.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.