Hal*_*top 5 php debugging symfony monolog
我在一个项目中使用Monolog,它不是Symfony,只是我自己的应用程序使用独立的Monolog组合器包.
我想做的是以编程方式关闭调试日志.我正在写一个日志文件,我正在使用Monolog :: StreamHandler.我正在使用从配置文件获取调试值的Configuration类来控制应用程序是否处于调试模式.因此,当有人将该值更改为调试为false时,调试日志记录应该关闭.
我觉得最简单的方法是扩展StreamHandler并覆盖StreamHandler的write方法.
class DurpLogger extends StreamHandler {
protected function write(array $record) {
if ($this->getLevel() == Durp::Debug && !Configuration::debug()) {
return;
}
parent::write($record);
}
}
Run Code Online (Sandbox Code Playgroud)
因此,如果日志请求进入并且处理程序的日志级别设置为DEBUG且应用程序的Configuration :: debug()为FALSE,则只返回而不写入日志消息.否则,StreamHandler会做它的事情.
我想知道这是否是使用Monolog的最佳方式,或者是否有更简洁的方法可以做到这一点.
我设想在我的应用程序中有一个处理程序,用于DEBUG,INFO,ERROR以及我的应用程序可能需要的任何级别.也许有理由不依赖于只能为TRUE或FALSE的Configuration :: debug(),而是依赖于Configuration :: logLevel(),这将允许我更精细地控制日志记录输出.
但即便如此,在应用程序级别控制Monolog时,扩展StreamHandler是否最有意义?
UPDATE
现在,我在想这样的事情,它使用的是水平而不仅仅是布尔调试.
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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后我会在这样的应用程序中使用它.
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');
}
}
Run Code Online (Sandbox Code Playgroud)
我认为StreamHandler处理文件写入的东西,所以这就是我扩展它的原因.如果我将Configuration中的日志级别调到Logger :: INFO,则不会记录"Debugging enabled"消息.
接受建议,以使这更好.
cha*_*asr 10
一种常见的替代方法是使用NullHandler而不是StreamHandler.
也许根据您的情况在它们之间切换如下:
if (!Configuration::debug()) {
$logger->pushHandler(new \Monolog\Handler\NullHandler());
}
Run Code Online (Sandbox Code Playgroud)
我想给你一个更适合你的用法的例子,
但我需要看一些代码才能知道你如何使用它.
更新
对于有关默认格式的问题,空[]
末尾表示可以添加日志条目的额外数据.
来自@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);
请参见如何不显示monolog日志行中的最后一个括号?和Symfony2:在登录 @Seldaek正在谈论的处理器的不同文件时使用处理器.