Урок 16: Логирование в Symfony. Monolog, настройка, кастомизация, примеры

В 16-ом уроке мы изучимв одну из тем для любого разработчика, это логирование в Symfony. Логирование это не просто запись ошибок в файл. Это инструмент, который помогает отслеживать работу приложения, находить узкие места, анализировать поведение пользователей и быстро реагировать на критические ситуации. В Symfony за логирование отвечает библиотека Monolog. И сегодня я подробно расскажу, как её настроить, кастомизировать и использовать для решения реальных задач.

Настройка Monolog в Symfony

Monolog это стандартный компонент для логирования в Symfony. Он гибок, поддерживает множество каналов (channels) и обработчиков (handlers) и его настройка занимает буквально несколько минут.

Базовая конфигурация

По умолчанию Symfony настраивает Monolog автоматически. Конфигурация находится в файле config/packages/monolog.yaml. Давайте разберём её структуру:

yaml
monolog:
    channels: ['main', 'security']
    handlers:
        main:
            type: stream
            path: "%kernel.logs_dir%/%kernel.environment%.log"
            level: debug
            channels: ['!event']
        security:
            type: stream
            path: "%kernel.logs_dir%/security.log"
            level: info
  • channels — логические разделы для группировки логов (например, main для общих логов, security для безопасности).
  • handlers — определяют, куда и как записывать логи. В примере выше два обработчика, main пишет в общий файл, security в отдельный.
  • level — минимальный уровень логирования (например, debuginfoerror).
  • channels: [‘!event’] — исключает канал event из обработки.

Уровни логирования в Monolog (от низкого к высокому):
DEBUG → INFO → NOTICE → WARNING → ERROR → CRITICAL → ALERT → EMERGENCY.

Запись логов в файлы, базу данных или Slack

Monolog поддерживает десятки обработчиков. Рассмотрим самые полезные.

1. Запись в файлы

Стандартный обработчик stream уже настроен в Symfony. Но вы можете добавить свой:

yaml
handlers:
    critical_log:
        type: stream
        path: "%kernel.logs_dir%/critical.log"
        level: critical
        channels: ['main']

Теперь все логи уровня CRITICAL будут сохраняться в critical.log.

2. Запись в базу данных

Для записи логов в БД через Doctrine:

Шаг 1. Создайте сущность LogEntry:

php
// src/Entity/LogEntry.php
namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity]
class LogEntry
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\Column(type: 'text')]
    private string $message;

    #[ORM\Column(type: 'string')]
    private string $level;

    // Геттеры и сеттеры...
}

Шаг 2. Добавьте обработчик в monolog.yaml:

yaml
handlers:
    doctrine:
        type: service
        id: App\Logger\DoctrineHandler

Шаг 3. Создайте сервис DoctrineHandler:

php
// src/Logger/DoctrineHandler.php
namespace App\Logger;

use App\Entity\LogEntry;
use Doctrine\ORM\EntityManagerInterface;
use Monolog\Handler\AbstractProcessingHandler;

class DoctrineHandler extends AbstractProcessingHandler
{
    public function __construct(private EntityManagerInterface $em)
    {
        parent::__construct();
    }

    protected function write(array $record): void
    {
        $logEntry = new LogEntry();
        $logEntry->setMessage($record['message']);
        $logEntry->setLevel($record['level_name']);

        $this->em->persist($logEntry);
        $this->em->flush();
    }
}

3. Отправка логов в Slack

Чтобы получать уведомления в Slack:

yaml
handlers:
    slack:
        type: slack
        token: "your-slack-token"
        channel: "#alerts"
        level: error

Токен можно получить в настройках Slack-приложения.

Кастомизация формата логов

По умолчанию Monolog использует формат:
[%datetime%] %channel%.%level_name%: %message% %context% %extra%

Чтобы изменить его, добавьте параметр formatter:

yaml
handlers:
    main:
        type: stream
        path: "%kernel.logs_dir%/custom.log"
        formatter: monolog.formatter.json

Или создайте свой форматтер:

yaml
services:
    custom_formatter:
        class: Monolog\Formatter\LineFormatter
        arguments:
            - "[%%datetime%%] %%level_name%%: %%message%%\n"

monolog:
    handlers:
        main:
            formatter: custom_formatter

Отладка через логирование

Логирование это мощный инструмент отладки. Пример использования в контроллере:

php
use Psr\Log\LoggerInterface;

class UserController extends AbstractController
{
    #[Route('/user/{id}', name: 'user_show')]
    public function show(int $id, LoggerInterface $logger): Response
    {
        $logger->info('Просмотр пользователя', ['user_id' => $id]);

        try {
            // Код, который может вызвать ошибку...
        } catch (\Exception $e) {
            $logger->error('Ошибка при загрузке пользователя', [
                'exception' => $e->getMessage(),
                'trace' => $e->getTraceAsString()
            ]);
        }

        return $this->render('user/show.html.twig');
    }
}

Используйте контекст (второй аргумент методов логирования) для передачи дополнительных данных.

Практические задачи

  1. Запись ошибок в отдельный файл.
    Настройте обработчик, который записывает все логи уровня ERROR и выше в var/log/errors.log.
  2. Интеграция с Slack
    Создайте канал #symfony-logs в Slack и настройте отправку туда сообщений уровня CRITICAL.
  3. Кастомизация формата.
    Измените формат логов так, чтобы в них включалось имя окружения (%kernel.environment%).
  4. Логирование в БД.
    Реализуйте сохранение логов уровня WARNING в таблицу log_entries через Doctrine.

Пример решения задачи 1

yaml
# config/packages/monolog.yaml
monolog:
    handlers:
        error_file:
            type: stream
            path: "%kernel.logs_dir%/errors.log"
            level: error
            channels: ['main']

Логирование это ваши глаза и уши в продакшене. Настройте его правильно и вы сможете быстро находить и исправлять ошибки, даже если они случаются у пользователей на другом конце света.

Полный курс по Symfony для начинающих: https://max-gabov.ru/symphony-dlya-nachinaushih

Поделиться статьей:
Поддержать автора блога

Поддержка автора осуществляется с помощью специальной формы ниже, предоставленной сервисом «ЮMoney». Все платёжные операции выполняются на защищённой странице сервиса, что обеспечивает их корректность и полную безопасность.

Персональные рекомендации
Оставить комментарий