Компонент Zend Log. Продолжение.
Продолжаем изучать компонент Zend Log. Первая часть данной статьи находится здесь.
Предобработка данных.
Если Вам необходимо в автоматическом режиме добавлять дополнительную информацию к логам, перед тем как они попадут в файл или какое-либо другое хранилище, то в этом случае Вы можете использовать класс Zend\Log\Processor. Этот класс будет исполняться каждый раз, перед тем как данные будут выводиться через класс Zend\Log\Writer. Напомню, что класс Writer является абстракцией, инкапсулирующей в себе работу с различными хранилищами, будь-то файл или база данных. Он предоставляет единый интерфейс для сохранения логов. Входными данными для класса Zend\Log\Processor служит событие логирования, которое представляет собой массив, включающий в себя всю информацию для логирования; выходными данными также является событие логирования, но такое, что может включать модифицированные или дополнительные значения. Т.е. класс Processor изменяет событие логирования до того, как оно будет послано в класс Writer.
Множественность источников сохранения данных
Одной из важных особенностей компонента zend-log является возможность вести запись логов в несколько различных хранилищ. Хранилища в коде представлены различным классами адаптеров. Например, Вы можете писать логи как в файлы, так и в базу данных.
<?php
use Zend\Db\Adapter\Adapter as DbAdapter;
use Zend\Log\Formatter;
use Zend\Log\Writer;
use Zend\Log\Logger;
// Адаптер базы данных
$db = new DbAdapter([
'driver' => 'Pdo',
'dsn' => 'mysql:dbname=mysitelog;host=localhost',
'username' => 'пользователь',
'password' => 'пароль'
]);
// соответствие полей события лога (поля события лога разбирали в предыдущей статье)
// колонкам в базе данных, т.е. например, поле времени timestamp из лога
// соответствует колонке date в базе
$mapping = [
'timestamp' => 'date',
'priority' => 'type',
'message' => 'event',
];
// создаем объект писателя (Writer) со следующими параметрами
// 1) $db - адаптер базы данных
// 2) 'log' - таблица логов в базе
// 3) $mapping - карта соответствия
$writerDb = new Writer\Db($db, 'log', $mapping); // log table
// объект форматера
$formatter = new Formatter\Base();
// используется, для преобразования даты события в формат даты MySQL
$formatter->setDateTimeFormat('Y-m-d H:i:s');
$writerDb->setFormatter($formatter);
// запись лога в файл
$writerFile = new Writer\Stream(__DIR__ . '/test.log');
// создаем объект класса Logger и регистрируем в нем
// объекты "писателей"
$logger = new Logger();
// объект, пишущий лог в базу данных
$logger->addWriter($writerDb, 1);
// объект, пишущий лог в файл
$logger->addWriter($writerFile, 100);
// сообщение лога
$logger->info('Informational message');
?>
Код хорошо комментирован, но остановлюсь на некоторых моментах. В нашем примере, мы совмещаем объекты класса Writer для базы данных и файла. Эти объекты добавляются в класс Logger при помощи метода addWriter(), которому во втором параметре передается число, обозначающее приоритет. Более высокий приоритет приводит к тому, что, объект писателя (Writer) с данным приоритетом будет вызываться раньше, чем аналогичный, но с меньшим. Мы выбрали приоритет 1 для писателя базы данных и приоритет 100 для файлового писателя; это означает, что логирование сначала будет идти в файл, а потом уже в базу данных. Также, обратите внимание, что мы используем специальный форматер даты для писателя базы данных. Это необходимо для того, чтобы правильно преобразовать дату из лога в дату базы данных.
Поддержка стандарта PSR-3
Я уже писал о PSR – стандартах в PHP. Поэтому, если Вам нужна совместимость со стандартом логирования PSR-3, то Вы можете использовать класс Zend\Log\PsrLoggerAdapter. Этот класс может быть использован везде, где необходим интерфейс Psr\Log\LoggerInterface. Вот пример:
<?php
use Psr\Log\LogLevel;
use Zend\Log\Logger;
use Zend\Log\PsrLoggerAdapter;
// создаем объект класса Logger
$zendLogLogger = new Logger;
// Psr-совместимый адаптер
$psrLogger = new PsrLoggerAdapter($zendLogLogger);
// запись информационного сообщения в лог
$psrLogger->log(LogLevel::INFO, 'Psr-совместимый класс логирования');
?>
Таким образом, компонент zend-log предлагает широкий набор свойств, включая поддержку множества источников записи и фильтрации данных лога. Также он совместим со стандартом PSR-3. Надеюсь, что материал был Вам полезен и понятен. Если же нет, то рекомендую ознакомиться с моим курсом "Cоздание и Раскрутка сайта от А до Я", из которого Вы узнаете все необходимое для создания собственного, прибыльного сайта.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.