Перейти к основному содержимому

Логгер приложения (Application logger)

Внимание

Чтобы использовать эту возможность, включите PimcoreApplicationLoggerBundle в вашем файле bundle.php и установите его командой:

bin/console pimcore:bundle:install PimcoreApplicationLoggerBundle

Общее

Пакет application logger — инструмент, который разработчики могут использовать для логирования определённых событий и ошибок в приложении на Pimcore.

Логи доступны и доступны для поиска в административной панели Pimcore: меню Tools Tools -> Application Logger:

Меню логгера приложения

Предпросмотр логгера приложения

Как создавать записи в логе

Application logger — PSR-3 совместимый сервис, доступный в контейнере как Pimcore\Bundle\ApplicationLoggerBundle\ApplicationLogger, и поэтому используется как обычный логгер.

Базовое использование — пример

Контроллер / экшен

<?php  

namespace App\Controller;

use Pimcore\Bundle\ApplicationLoggerBundle\ApplicationLogger;
use Pimcore\Controller\FrontendController;

class TestController extends FrontendController
{
// вводится в качестве аргумента экшена (контроллер должен быть зарегистрирован как сервис)
public function testAction(ApplicationLogger $logger): void
{
$logger->error('Your error message');
$logger->alert('Your alert');
$logger->debug('Your debug message', ['foo' => 'bar']); // дополнительная контекстная информация
}

public function anotherAction(): void
{
// получаем из контейнера
$logger = $this->get(ApplicationLogger::class);
$logger->error('Your error message');
}
}

Внедрение зависимостей

App\YourService:   
calls:
- [setLogger, ['@Pimcore\Bundle\ApplicationLoggerBundle\ApplicationLogger']]

Также можно использовать автоподключение (autowiring), просто объявив зависимость:

services:  
_defaults:
autowire: true

App\YourService: ~

<?php  

namespace App;

use Pimcore\Bundle\ApplicationLoggerBundle\ApplicationLogger;

class YourService
{
/**
* @var ApplicationLogger
*/
private $logger;

public function __construct(ApplicationLogger $logger)
{
$this->logger = $logger;

$logger->debug('Hello from YourService');
}
}

Использование как обработчика monolog

Вместо прямого использования класса ApplicationLoggerвы можете настроить monolog так, чтобы он использовал application logger как обработчик логирования и воспользоваться всеми возможностями monolog. Чтобы сделать это, Pimcore предоставляет обработчик ApplicationLoggerDb для monolog, который уже преднастроен как сервис и легко регистрируется в monolog:

monolog:  
handlers:
# monolog позволяет регистрировать кастомные обработчики через type: service
# единственная поддерживаемая дополнительная опция кроме type и id — channels
application_logger_db:
type: service
id: Pimcore\Bundle\ApplicationLoggerBundle\Handler\ApplicationLoggerDb
channels: ["application_logger"]

Обратите внимание: указанные каналы должны существовать. Это можно обеспечить, настроив их вручную или используя DI-теги для выбора логгера для нужного канала. При использовании DI-тегов канал будет создан неявно monolog.

ВАЖНО: Поскольку ApplicationLoggerDb зависит от подключения к базе данных, важно исключить из этого обработчика каналы, логирующие запросы к базе (обычно канал doctrine), чтобы избежать бесконечных циклов. Либо явно указывайте список поддерживаемых каналов allowlist (как показано в примере выше) либо исключайте doctrine через channels: ["!doctrine"].

Поскольку конфигурация обработчика type: service не поддерживает фильтрацию по уровню лога, вы можете использовать тип обработчика filter для оборачивания application logger и фильтрации по определенному уровню лога:

monolog:  
handlers:
# Обработчик filter можно использовать для фильтрации по заданному уровню лога.
# Обратите внимание, что поддерживаемые каналы теперь настроены в обработчике фильтра.
# Для фильтрации по уровню вы можете установить допустимые уровни (accepted_levels) или минимальные уровни (min_level) и максимальные уровни(max_level).
# См. https://github.com/symfony/monolog-bundle/blob/master/DependencyInjection/Configuration.php#L97
# для подробностей.
application_logger_filter:
type: filter
channels: ["application_logger"]
handler: application_logger_db
min_level: ERROR
application_logger_db:
type: service
id: Pimcore\Bundle\ApplicationLoggerBundle\Handler\ApplicationLoggerDb

Конечно, обработчик можно использовать совместно с другими обработчиками, например Fingers Crossed Handler. См. документацию Symfony Logging для подробностей.

После настройки обработчика вы можете использовать его как любой другой monolog-логгер, задав DI-тег для сервиса, чтобы указать, в какой канал логировать:

<?php  

namespace App\Controller;

use Psr\Log\LoggerInterface;

// в качестве примера мы возьмем контроллер, но это может быть любой сервис
// здесь нет необходимости расширять базовый контроллер, поскольку мы вводим наши зависимости
// через DI
class TestController
{
private LoggerInterface $logger;

public function __construct(LoggerInterface $logger)
{
$this->logger = $logger;
}

public function testAction(): void
{
$this->logger->error('Your error message');
}
}

В определении сервиса можно добавить тег DI, чтобы указать, какой логгер следует внедрить:

services:  
App\Controller\TestController:
arguments:
$logger: '@logger'
tags:
- { name: monolog.logger, channel: application_logger }

Также можно автоподключать канал логгера, изменив имя аргумента на формат: (имя канала в camelCase) + Logger.

Пример для канала foo_bar:

  public function __construct(LoggerInterface $fooBarLogger)  
{
$this->logger = $fooBarLogger;
}

Более подробная информация об обработчиках каналов логирования

Специальные переменные контекста

Есть некоторые переменные контекста с особыми функциями: fileObject, relatedObject, component.

<?php  

namespace App\Controller;

use Pimcore\Bundle\ApplicationLoggerBundle\ApplicationLogger;
use Pimcore\Bundle\ApplicationLoggerBundle\FileObject;
use Pimcore\Model\DataObject\AbstractObject;
use Symfony\Component\HttpFoundation\Response;

class TestController
{
public function testAction(ApplicationLogger $logger): Response
{
$fileObject = new FileObject('some interesting data');
$myObject = DataObject::getById(73);

$logger->error('my error message', [
'fileObject' => $fileObject,
'relatedObject' => $myObject,
'component' => 'different component',
'source' => 'Stack trace or context-relevant information' // необязательно, если пусто, автоматически заполняется строкой class:method:line, из которой был выполнен лог
]);

// ...
}
}

В сетке application logger появится новая строка: my error message с привязанным объектом.

По клику на строку вы можете перейти в редактор объекта, нажав на иконку редактирования Related object во всплывающем окне.

Всплывающее окно логгера приложения

Логирование исключений

Application logger предоставляет helper-метод для логирования исключений и неявного создания FileObject из исключения при записи лога. Это можно сделать двумя способами в зависимости от того, как вы используете application logger:

<?php  

use Pimcore\Bundle\ApplicationLoggerBundle\ApplicationLogger;

$exception = new \RuntimeException('failed :(');

// 1) При непосредственном использовании логгера приложения (см. базовое использование выше).
// Логгер является экземпляром `ApplicationLogger`:

/** @var ApplicationLogger $appLogger */
$appLogger->logException('Oh no!', $exception, 'alert', $relatedObject, $component);

// 2) Когда используете как monolog-обработчик. Если $logger — любой PSR-3 совместимый логгер,
// можно использовать статический хелпер для создания такой же записи с FileObject как в приведенном выше вызове
// логирования.

/** @var \Psr\Log\LoggerInterface $logger */
ApplicationLogger::logExceptionObject($logger, 'Oh no!', $exception, 'alert', $relatedObject);

Установка индивидуального уровня логгера

Добавление консольного логгера и установка минимального уровня логирования INFO (перезаписывает уровень логирования в настройках системы Pimcore):

$logger = \Pimcore\Bundle\ApplicationLoggerBundle\ApplicationLogger::getInstance("SAP_exporter", true);   
// возвращает PSR-3 совместимый логгер, регистрирует кастомный app logger как `pimcore.app_logger.SAP_exporter` в сервис контейнере
$logger->addWriter(new \Monolog\Handler\StreamHandler('php://output', \Monolog\Logger::INFO));

Конфигурация

В системных настройках (панель Debug) доступны опции для настройки application logger:

Настройки Application logger

Если включена опция Send log summary per mail, заданные получатели будут получать суммарные письма с логами. Параметр приоритета (priority) позволяет настроить, какие сообщения попадут в письмо. Например, ошибки выше по важности, чем информационные записи.

Функция архивации автоматически создаёт новые таблицы в базе для архивации записей логов в формате application_logs_archive_*. В приведённом примере записи переместятся в архивные таблицы по прошествии 30 дней. При желании можно задать другое имя базы данных для архивных таблиц.


Вы можете предложить улучшение документации или задать вопрос в комментариях.
Если вам нужна полноценная консультация — вы можете заказать её на нашем сайте.