Логгер приложения (Application logger)
Внимание
Чтобы использовать эту возможность, включите PimcoreApplicationLoggerBundle в вашем файле bundle.php и установите его командой:
bin/console pimcore:bundle:install PimcoreApplicationLoggerBundle
Общее
Пакет application logger — инструмент, который разработчики могут использовать для логирования определённых событий и ошибок в приложении на Pimcore.
Логи доступны и доступны для поиска в административной панели Pimcore: 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:

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