我在项目中使用Monolog,它不是Symfony,只是我自己的应用程序使用独立的Monolog编写器包。
我想做的是以编程方式关闭调试日志。我正在写一个日志文件,而且我正在使用Monolog :: StreamHandler。我使用从配置文件获取调试值的Configuration类来控制应用程序是否处于调试模式。因此,当有人将该值更改为调试为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以及我的应用程序可能需要的任何级别。也许有理由不依赖于只能为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处理文件写入内容,这就是我为什么要扩展它的原因。如果我将Configuration中的日志级别调到Logger :: INFO,那么"调试已启用"消息没有记录。
愿意提出改善建议的建议。
答案 0 :(得分:8)
常见的替代方法是使用NullHandler而不是StreamHandler。
根据您的情况,可能会在它们之间切换,如下所示:
if (!Configuration::debug()) {
$logger->pushHandler(new \Monolog\Handler\NullHandler());
}
我想给你一个更适合你用法的例子,
但我需要看一些代码才能知道你是如何使用它的。
<强>更新强>
对于有关默认格式的问题,末尾的空[]
表示可以添加日志条目的额外数据。
来自@Seldaek(Monolog的所有者):
LineFormatter的默认格式为: “[%datetime%]%channel%。%level_name%:%message %% context %% extra%\ n”。用户名/年龄是上下文,而额外的通常是空的结果是这个空数组[]。
如果使用处理器将数据附加到日志记录,则通常会将其写入额外的密钥以避免与上下文信息冲突。如果它确实是您的问题,您可以更改默认格式并省略%extra%。
编辑:从Monolog 1.11开始,LineFormatter在构造函数中有一个$ ignoreEmptyContextAndExtra参数,允许你删除它们,所以你可以使用它:
// the last "true" here tells it to remove empty []'s
$formatter = new LineFormatter(null, null, false, true);
$handler->setFormatter($formatter);
有关@Seldaek正在讨论的处理器,请参阅How not to show last bracket in a monolog log line?和Symfony2 : use Processors while logging in different files。