Продолжаем изучать компонент Zend Log . Первая часть данной статьи находится здесь .

Компонент 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оздание и Раскрутка сайта от А до Я", из которого Вы узнаете все необходимое для создания собственного, прибыльного сайта.