«Битрикс» и PSR-3





PSR-3 и «Битрикс» — теперь реальность! Не так давно я подружил один из лучших PHP-логеров — Monolog — с «Битриксом». Да не просто подружил, а вынес конфигурирование логеров за пределы логики приложения (чего «Битрикс», к сожалению, тоже не умеет). Но обо всём по порядку.

Адаптер, как обычно, вы можете найти в организации «Битрикс-эксперты». Требуется «Битрикс» версии 15.0.2 или выше и PHP не ниже версии 5.4.

Зачем PSR-3 и Monolog?



PSR-3 является международным PHP-стандартом, описывающим интерфейс логирования. Благодаря единому стандарту, любая PSR-ориентированная библиотека (коих огромное количество на просторах интернета) может легко подключаться к вашему проекту. Она будет работать по интерфейсу, описанному в PSR. Сам же логер может быть абсолютно любым, главное, что бы он реализовывал этот интерфейс.

Monolog является одним из самых популярных и функциональных логеров в мире PHP. В нём реализовано огромное количество хендлеров: вы можете писать логи в файл, отправлять их на почту, пушить в систему логирования, выводить в консоль браузера… Список можно долго продолжать, но кроме того, вы можете без проблем написать свою логику логера — Monolog легко поддаётся кастомизации и весьма гибко настраивается. Если вы ещё не знакомы с ним, самое время это исправить. В репозитории библиотеки находится подробная документация с описанием архитектуры логера и его возможностей.

При настройке логеров не забывайте учитывать объёмы производимых ими записей. И помните, что ваша программа может в любой момент дать сбой, который повлечёт за собой колоссальный прирост размеров логов и интенсивность их записи. Настраивайте ротацию логов, не пишите их в основную БД приложения, используйте специализированные системы агрегации логов, такие как Kibana, Sentry, Gray2Log.

Логеры: конфигурация и применение

Настройки логеров нужно описывать в .settings.php. Это, практически, реализация шаблона «Сервис-локатор» (да, и этого в «Битриксе» тоже нет), за небольшим исключением. С таким подходом код приложения получает логер извне, как зависимость. Нет необходимости смешивать бизнес-логику с настройками. Кроме того, настройки логеров могут легко меняться без изменения кода приложения.

Материал по теме: «Проблема инициализации объектов в ООП приложениях на PHP. Поиск решения при помощи шаблонов Registry, Factory Method, Service Locator и Dependency Injection».

Настройки логеров описываются в массиве monolog: указывается перечь хендлеров, форматеров, процессоров и самих логеров. Просто пример описания логеров в настройках приложения:
<?php

// .settings.php

return array(
    'monolog' => array(
        'value' => array(
            'handlers' => array(
                'default' => array(
                    'class' => '\Monolog\Handler\StreamHandler',
                    'level' => 'DEBUG',
                    'stream' => '/path/to/logs/app.log'
                ),
                'feedback_event_log' => array(
                    'class' => '\Bex\Monolog\Handler\BitrixHandler',
                    'level' => 'DEBUG',
                    'event' => 'TYPE_FOR_EVENT_LOG',
                    'module' => 'vendor.module'
                ),
            ),
            'loggers' => array(
                'app' => array(
                    'handlers'=> array('default'),
                ),
                'feedback' => array(
                    'handlers'=> array('feedback_event_log'),
                )
            )
        ),
        'readonly' => false
    )
);

Логер app будет писать в файл, логер feedback — в журнал событий.

Теперь использовать логеры проще простого. Запрашивайте нужный логер в своих скриптах через Registry и пишите сообщения:

<?php

use Monolog\Registry;
$logger = Registry::getInstance('feedback');

// Дебаг
$logger->debug('Debug message');

// Cообщение об ошибке
$logger->error('Error message');

// Информационное сообщение. Добавим контекст.
$logger->info('Failed create new message on feedback form', [
   'Invalid data' => $addResult->getErrorMessages(), // Запишем в контекст ошибки формы.
   'Form data' => $formRequest // И данные, переданные в форму.
]);

Непойманные исключения

В новом ядре «Битрикса» появилась возможность устанавливать свой логер для непойманных исключений. Понятное дело, из-за отсутствия поддержки PSR-3 так просто Monolog не подключить. Но адаптер решает и эту проблему, теперь вам просто нужно в .settings.php указать класс перехватчика исключений и название логера, отвечающего за них:
<?php

// .settings.php

return array(
    'exception_handling' => array(
        'value' => array(
            'log' => array(
                'class_name' => '\Bex\Monolog\ExceptionHandlerLog',
                'settings' => array(
                    'logger' => 'app',
                ),
            ),
        ),
        'readonly' => false
    ),
    'monolog' => array(
        'value' => array(
            'handlers' => array(
                'default' => array(
                    'class' => '\Monolog\Handler\StreamHandler',
                    'level' => 'DEBUG',
                    'stream' => '/path/to/logs/app.log'
                )
            ),
            'loggers' => array(
                'app' => array(
                    'handlers'=> array('default'),
                ),
            )
        ),
        'readonly' => false
    )
);


Журнал событий

В Monolog-адаптере присутствует BitrixHandler, позволяющий производить запись логов в журнал событий «Битрикса»:
<?php

use Bex\Monolog\Handler\BitrixHandler;
use Monolog\Logger;

$logger->pushHandler(new BitrixHandler('event_type', 'module', Logger::INFO));

В результате, записи лога будут отображаться в панели управления «Битрикса»:



***


Monolog сделает процесс внедрения логеров приятным удовольствием. Больше не нужно вспоминать недокументированное API «Битрикса», выносить его в сниппеты. Внедрение дебаг-логов легко закладывается сразу же при разработке кода программы и ещё проще производится их отключение и включение. Смена места хранения логов не потребует внесения изменений в код приложения. А широкий спектр хендлеров, форматеров и процессоров позволит весьма гибко настраивать сбор логов.

Комментарии

comments powered by HyperComments