fi1a/log

PHP библиотека ведения журнала (логирования)

dev-master 2023-02-22 02:30 UTC

This package is auto-updated.

Last update: 2024-12-22 06:32:03 UTC


README

Latest Version Software License PHP Version Coverage Status Total Downloads Support mail

Данный пакет предоставляет функционал ведения журнала (логирования), используя обработчики. На данный момент доступны обработчики записи в файл, syslog и отправка записей на email адрес. Наличие "каналов" позволяет вести журнал, отправляя записи в разные обработчики с разными настройками. Один канал может содержать множество обработчиков записей журнала. Сообщения журнала могут быть записаны в разные обработчики в зависимости от их серьезности (уровня).

Установка

Установить этот пакет можно как зависимость, используя Composer.

composer require fi1a/log

Хелпер

В пакете доступен хелпер:

logger(?string $channel = null): ChannelsInterface|LoggerInterface|false;

Он возвращает каналы логгера.

Используя канал логирования channel1, записать в лог критическую ошибку:

logger('channel1')->critical('Critical error with {{value}}', ['value' => 'message',], ['id' => 1]);

Конфигурирование

Конфигурирование канала осуществляется путем добавления экземпляра класса Fi1a\Log\Logger, используя метод addChannel класса Fi1a\Log\ChannelsInterface возвращаемого хелпером logger без передачи аргументов.

Обработчики добавляются методом addHandler класса Fi1a\Log\Logger. В примере добавляются обработчики для записи в файл журнала Fi1a\Log\Handlers\StreamHandler записей с уровнем Fi1a\Log\LevelInterface::ERROR и отправку на email записей с уровнем Fi1a\Log\LevelInterface::EMERGENCY с помощью обработчика Fi1a\Log\Handlers\MailHandler.

use Fi1a\Log\Handlers\MailHandler;
use Fi1a\Log\Handlers\StreamHandler;
use Fi1a\Log\LevelInterface;
use Fi1a\Log\Logger;

$logger = new Logger('channel1');

$logger->addHandler(new StreamHandler(__DIR__ . '/filelog.log', LevelInterface::ERROR));
$logger->addHandler(new MailHandler('to@fi1a.ru', 'from@fila.ru', LevelInterface::EMERGENCY));

logger()->addChannel($logger);

Доступные обработчики

  • Fi1a\Log\Handlers\StreamHandler - обработчик логирования в файл (поток);
  • Fi1a\Log\Handlers\RotatingFileHandler - сохраняет логи в файлах с именем по маске времени. Хранится ограниченное кол-во файлов;
  • Fi1a\Log\Handlers\SyslogHandler - логирование в syslog;
  • Fi1a\Log\Handlers\MailHandler - отправка логов на почту.

Fi1a\Log\Handlers\StreamHandler

Сохранение записей журнала в файл или поток.

use Fi1a\Log\Handlers\StreamHandler;

$handler = new StreamHandler(__DIR__ . '/filelog.log', LevelInterface::ERROR);
$logger->addHandler($handler);

Fi1a\Log\Handlers\RotatingFileHandler

Сохранение записей журнала в файлах с именем по маске времени. Хранится ограниченное кол-во файлов.

use Fi1a\Log\Handlers\RotatingFileHandler;

$handler = new RotatingFileHandler(__DIR__ . '/filelog.log', 2, 'Y-m-d', LevelInterface::ERROR);
$logger->addHandler($handler);

Fi1a\Log\Handlers\SyslogHandler

Сохранение записей журнала, используя syslog.

use Fi1a\Log\Handlers\SyslogHandler;

$handler = new SyslogHandler('error', LOG_USER, LevelInterface::ERROR);
$logger->addHandler($handler);

Fi1a\Log\Handlers\MailHandler

Отправка записей журнала на почту.

use Fi1a\Log\Handlers\MailHandler;

$handler = new MailHandler('to@fi1a.ru', 'from@fila.ru', LevelInterface::ERROR);
$logger->addHandler($handler);

Запись сообщений журнала

Вы можете записывать информацию в журнал с помощью канала возвращаемого хелпером logger, который при передаче аргумента с названием канала возвращает его. Средство ведения журнала обеспечивает восемь уровней: emergency, alert, critical, error, warning, notice, info, и debug. Для каждого уровня есть свой метод записи в журнал:

$logger = logger('channel1');

$logger->emergency('Log {{value}}', ['value' => 'message'], ['id' => 1]);
$logger->alert('Log {{value}}', ['value' => 'message'], ['id' => 1]);
$logger->critical('Log {{value}}', ['value' => 'message'], ['id' => 1]);
$logger->error('Log {{value}}', ['value' => 'message'], ['id' => 1]);
$logger->warning('Log {{value}}', ['value' => 'message'], ['id' => 1]);
$logger->notice('Log {{value}}', ['value' => 'message'], ['id' => 1]);
$logger->info('Log {{value}}', ['value' => 'message'], ['id' => 1]);
$logger->debug('Log {{value}}', ['value' => 'message'], ['id' => 1]);
  • emergency - система не работает;
  • alert - ошибка. Необходимо принять меры немедленно.
  • critical - критическая ошибка;
  • error - ошибка, которая не требует немедленных действий, но должна быть записана;
  • warning - предупреждение;
  • notice - все нормально, но событие значимое;
  • info - какое-либо событие;
  • debug - отладочная информация.

Также доступен метод log для записи в журнал с передачей уровня логирования в аргументе:

$logger = logger('channel1');

$logger->log(LevelInterface::ERROR, 'Log {{value}}', ['value' => 'message'], ['id' => 1]);

Контекстная информация

Методом withContext класса Fi1a\Log\Logger (для этого канала), или класса Fi1a\Log\Channels (для всех каналов) может быть передан массив контекстных данных, которые будут включены во все последующие записи журнала. Также контекстные данные можно передать третьим аргументом любого из методов записи в журнал, эти контектсные данные будут использованы только к этой записи.

// Глобально для всех каналов
logger()->withContext(['pid' => 1]);

// Для конкретного канала
$logger = logger('channel1');
$logger->withContext(['uid' => 2]);

// Для конкретной записи
$logger->error('Log {{value}}', ['value' => 'message'], ['id' => 1]);

/*
14.01.2023 10:18:58
channel1.ERROR[500]
Log message
{"pid":1,"uid":2,"id":1}
 */

Форматирование

Доступны следующие классы для форматирования сообщений журнала:

  • Fi1a\Log\Formatters\TextFormatter - форматирование записи лога в текст;
  • Fi1a\Log\Formatters\HtmlFormatter - форматирование записи лога в виде html.

Каждому обработчику можно передать объект форматирование записи журнала в конструктор.

use Fi1a\Log\Formatters\HtmlFormatter;
use Fi1a\Log\Handlers\StreamHandler;
use Fi1a\Log\LevelInterface;

$formatter = new HtmlFormatter();

$logger->addHandler(
    new StreamHandler(
        __DIR__ . '/log.html',
        LevelInterface::DEBUG,
        0776,
        false,
        $formatter
    )
);

logger()->addChannel($logger);

$logger->error('Log {{value}}', ['value' => 'message'], ['id' => 1]);