В одной из прошлых статей я рассказал, какого подхода придерживаюсь при логировании. А сегодня расскажу о том, как это лучше делать в коде.
📌 Начну сразу с анонса: в следующем посте покажу свою реализацию 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 минут на внедрение, но экономит часы при смене инструментов и дебаггинге.
💬 Обсудить пост:
- Telegram → https://t.me/buriy_dev
- ВКонтакте → https://vk.com/buriy_dev
- Max → https://max.ru/id616507661604_biz
🔥 И не забудь подписаться :)