如何使用Monolog关闭调试日志

时间:2016-02-24 19:02:20

标签: php symfony debugging monolog

我在项目中使用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,那么"调试已启用"消息没有记录。

愿意提出改善建议的建议。

1 个答案:

答案 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