如何使用Monolog关闭调试日志

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正在谈论的处理器的不同文件时使用处理器.