【发布时间】:2016-06-07 06:03:16
【问题描述】:
我在一个项目中使用 Monolog,它不是 Symfony,只是我自己的应用程序,它使用了独立的 Monolog composer 包。
我想做的是以编程方式关闭调试日志。我正在写入日志文件,并且正在使用 Monolog::StreamHandler。我正在使用从配置文件获取调试值的配置类来控制应用程序是否处于调试模式。因此,当有人将该值更改为调试为 false 时,调试日志记录应该关闭。
我觉得最简单的方法是像这样扩展 StreamHandler 并覆盖 StreamHandler 的 write 方法。
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 以及我的应用程序可能需要的任何级别。也许不依赖只能是 TRUE 或 FALSE 的 Configuration::debug() 是有意义的,而是一个允许我更精细地控制日志输出的 Configuration::logLevel() 是有意义的。
但即便如此,在应用程序级别控制 Monolog 时,扩展 StreamHandler 是否最有意义?
更新
现在,我在想这样的事情,它使用级别而不是布尔调试。
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 处理文件写入内容,所以这就是我扩展它的原因。如果我将配置中的日志级别设置为 Logger::INFO,则不会记录“启用调试”消息。
欢迎提出改进建议。
【问题讨论】:
标签: php symfony debugging monolog