🐘 PSR-3: Логируй так, чтобы не переписывать

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

📌 Начну сразу с анонса: в следующем посте покажу свою реализацию CombineLogger, которая упрощает мне жизнь. А сегодня - база, без которой эта реализация не имела бы смысла.

В проектах часто используют логи. Monolog, нативный логгер из фреймворка или свои велосипеды... вариантов много. Проблема возникает, когда нужно заменить одну библиотеку на другую. Если код завязан на конкретную реализацию - правки будут по всему проекту.

PSR-3 решает эту проблему раз и навсегда.

PSR-3 - это единый интерфейс для логирования. Любая библиотека, которая его реализует, становится взаимозаменяемой.


📌 Вот как он выглядит:

interface LoggerInterface
{
  public function emergency(string $message, array $context = []);
  public function alert(string $message, array $context = []);
  public function critical(string $message, array $context = []);
  public function error(string $message, array $context = []);
  public function warning(string $message, array $context = []);
  public function notice(string $message, array $context = []);
  public function info(string $message, array $context = []);
  public function debug(string $message, array $context = []);
  public function log($level, string $message, array $context = []);
}

👍 Что даёт PSR-3:

  • Гибкость: сменил библиотеку - не меняешь код
  • Единый подход: любой разработчик понимает, как логировать
  • Структурированные логи: передавай контекст, а не склеивай строки

🎯 Мой подход:

  • ✅ Всегда принимаю в конструктор Psr\Log\LoggerInterface.
  • ✅ Никакой привязки к Monolog или другой библиотеке - только интерфейс!
  • ✅ Контекст - это сила: передаю структурированные данные, а не склеиваю строки.

Пример, как не надо:

$this->logger->error('Ошибка оплаты для заказа 12345, пользователь 678, сумма 100.5');

Пример, как надо:

$this->logger->error('Ошибка оплаты', [
  'order_id' => 12345,
  'user_id' => 678,
  'amount' => 100.50
]);

Второй вариант позволяет фильтровать логи по полям в Elasticsearch, не требует парсинга строк и легко читается и расширяется.

Стандарты - это не про бюрократию. Это про то, чтобы код не приходилось переписывать.


PSR-3 занимает 5 минут на внедрение, но экономит часы при смене инструментов и дебаггинге.


💬 Обсудить пост:

🔥 И не забудь подписаться :)