В 16-ом уроке мы изучимв одну из тем для любого разработчика, это логирование в Symfony. Логирование это не просто запись ошибок в файл. Это инструмент, который помогает отслеживать работу приложения, находить узкие места, анализировать поведение пользователей и быстро реагировать на критические ситуации. В Symfony за логирование отвечает библиотека Monolog. И сегодня я подробно расскажу, как её настроить, кастомизировать и использовать для решения реальных задач.
Настройка Monolog в Symfony
Monolog это стандартный компонент для логирования в Symfony. Он гибок, поддерживает множество каналов (channels) и обработчиков (handlers) и его настройка занимает буквально несколько минут.
Базовая конфигурация
По умолчанию Symfony настраивает Monolog автоматически. Конфигурация находится в файле config/packages/monolog.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 — минимальный уровень логирования (например,
debug,info,error). - channels: [‘!event’] — исключает канал
eventиз обработки.
Уровни логирования в Monolog (от низкого к высокому):
DEBUG → INFO → NOTICE → WARNING → ERROR → CRITICAL → ALERT → EMERGENCY.
Запись логов в файлы, базу данных или Slack
Monolog поддерживает десятки обработчиков. Рассмотрим самые полезные.
1. Запись в файлы
Стандартный обработчик stream уже настроен в Symfony. Но вы можете добавить свой:
handlers: critical_log: type: stream path: "%kernel.logs_dir%/critical.log" level: critical channels: ['main']
Теперь все логи уровня CRITICAL будут сохраняться в critical.log.
2. Запись в базу данных
Для записи логов в БД через Doctrine:
Шаг 1. Создайте сущность LogEntry:
// 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:
handlers: doctrine: type: service id: App\Logger\DoctrineHandler
Шаг 3. Создайте сервис DoctrineHandler:
// 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:
handlers: slack: type: slack token: "your-slack-token" channel: "#alerts" level: error
Токен можно получить в настройках Slack-приложения.
Кастомизация формата логов
По умолчанию Monolog использует формат:
[%datetime%] %channel%.%level_name%: %message% %context% %extra%
Чтобы изменить его, добавьте параметр formatter:
handlers: main: type: stream path: "%kernel.logs_dir%/custom.log" formatter: monolog.formatter.json
Или создайте свой форматтер:
services: custom_formatter: class: Monolog\Formatter\LineFormatter arguments: - "[%%datetime%%] %%level_name%%: %%message%%\n" monolog: handlers: main: formatter: custom_formatter
Отладка через логирование
Логирование это мощный инструмент отладки. Пример использования в контроллере:
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'); } }
Используйте контекст (второй аргумент методов логирования) для передачи дополнительных данных.
Практические задачи
- Запись ошибок в отдельный файл.
Настройте обработчик, который записывает все логи уровняERRORи выше вvar/log/errors.log. - Интеграция с Slack
Создайте канал#symfony-logsв Slack и настройте отправку туда сообщений уровняCRITICAL. - Кастомизация формата.
Измените формат логов так, чтобы в них включалось имя окружения (%kernel.environment%). - Логирование в БД.
Реализуйте сохранение логов уровняWARNINGв таблицуlog_entriesчерез Doctrine.
Пример решения задачи 1
# 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». Все платёжные операции выполняются на защищённой странице сервиса, что обеспечивает их корректность и полную безопасность.


