Здравствуйте.
У меня есть средних размеров монолитное приложение, написанное на symfony (~150 сервисов), для логгирования используется monolog.
Практически в каждом сервисе есть логгирование операций (логгер внедряется как зависимость) и возникла проблема с фильтрацией сообщений по отправителю.
Скажем, в двух сервисах есть такой код:
// AService
$this->logger->info("Message sent to {user}", ['user' => $user]);
// BService
$this->logger->info("Message sent to {user}", ['user' => $user]);
В лог-файле мне хотелось бы понимать какой именно сервис отправил эту строку и что ей предшествовало именно в контексте этого сервиса.
Какие я вижу решения проблемы:
1. Писать в каждом сервисе в каждое сообщение некую метку:
// AService
$this->logger->info("{service} some message", ['service' => __CLASS__]);
$this->logger->info("{service} another message", ['service' => __CLASS__]);
2. Внедрять в каждый сервис свой логгер, настроенный на определенный канал.
3. Написать свой логгер, который в методе log будет получать бэктрейс, доставать оттуда класс, в котором был вызван метод логгера, и добавлять его к сообщению.
В общем, все три варианта мне не нравятся.
В первом получится слишком много рутинной работы и копипасты.
Во втором получится количество логгеров равное количеству сервисов (а это больше сотни), что нужно будет как-то поддерживать, не забывать при заведении нового сервиса создавать для него собственный логгер, от этого распухнет контейнер.
В третьем мне не нравится производительность решения и общая его костыльность.
Пожалуйста, поделитесь своими мыслями на этот счёт. Как бы вы организовали логгирование в таком случае?