Я использую Monolog в проекте, это не Symfony, а просто мое собственное приложение, использующее автономный пакет композитора Monolog.
Я бы хотел программно отключить журналы отладки. Я пишу в файл журнала и использую Monolog :: StreamHandler. Я контролирую, находится ли приложение в режиме отладки или нет, с помощью класса конфигурации, который получает значение отладки из файла конфигурации. Поэтому, когда кто-то изменяет это значение на отладочное значение false, ведение журнала отладки должно отключаться.
Мне казалось, что самый простой способ сделать это - расширить StreamHandler и переопределить метод записи StreamHandler, подобный этому.
class DurpLogger extends StreamHandler {
protected function write(array $record) {
if ($this->getLevel() == Durp::Debug && !Configuration::debug()) {
return;
}
parent::write($record);
}
}
Поэтому, если поступает запрос журнала и уровень журнала для обработчика установлен на DEBUG, а Configuration :: debug () приложения имеет значение FALSE, тогда просто вернитесь, не записывая сообщение журнала. В противном случае StreamHandler сделает свое дело.
Мне интересно, лучший ли это способ использовать Monolog или, возможно, есть более чистый способ сделать это.
Я предполагаю, что в моем приложении будет обработчик для DEBUG, INFO, ERROR и любых уровней, которые могут мне понадобиться для моего приложения. Возможно, имеет смысл полагаться не на Configuration :: debug (), который может иметь только значение TRUE или FALSE, а на Configuration :: logLevel (), который позволит мне более детально контролировать вывод журнала.
Но, тем не менее, имеет ли смысл расширение StreamHandler при управлении Monolog на уровне приложения?
ОБНОВЛЕНИЕ
Теперь я думаю о чем-то вроде этого, в котором используется уровень, а не просто логическая отладка.
class DurpLogger extends StreamHandler {
public function __construct() {
parent::__construct(Configuration::logFile(), Configuration::logLevel());
}
protected function write(array $record) {
if (!($this->getLevel() >= Configuration::logLevel())) {
return;
}
parent::write($record);
}
}
Тогда я бы использовал это в приложении вот так.
class Durp {
private $logger;
public function __construct() {
$this->logger = new Logger('durp-service');
$this->logger->pushHandler(new DurpLogger());
$this->logger->addDebug('Debugging enabled');
$this->logger->addInfo('Starting Durp');
}
}
Я подумал, что StreamHandler обрабатывает записи файлов, поэтому я расширяю его. И если я увеличиваю уровень журнала в Configuration до Logger :: INFO, сообщение «Отладка включена» не регистрируется.
Открыт для предложений, чтобы сделать это лучше.