如何使用Monolog关闭调试日志记录

6
我正在一个项目中使用Monolog,这不是Symfony,而是我自己的应用程序,它使用独立的Monolog composer包。我想要做的是以编程方式关闭调试日志记录。我正在写入日志文件并使用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);
    }
}

如果一个日志请求到达且处理器的日志级别设置为DEBUG,而应用程序的Configuration::debug()为FALSE,则只需返回而不写入日志消息。否则,StreamHandler将执行其操作。
我在想是否这是使用Monolog的最佳方式,或者可能有更简洁的方法来完成此操作。
我预计我的应用程序中会有一个DEBUG、INFO、ERROR和其他我可能需要的级别的处理器。也许不依赖于仅能为TRUE或FALSE的Configuration::debug(),而是依赖于Configuration::logLevel(),以允许我更细粒度地控制日志记录输出,这样更有意义。
但即使如此,在应用程序级别上控制Monolog时,扩展StreamHandler是否是最合适的选择呢?
更新:
现在,我考虑使用级别而不仅仅是布尔型的debug,类似以下代码:
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,那么"Debugging enabled"消息就不会被记录。

欢迎提出建议,让内容更加易懂。

1个回答

13

一个常见的替代方案是使用NullHandler而不是StreamHandler。

根据您的条件,可以像以下这样在它们之间切换:

if (!Configuration::debug()) {
    $logger->pushHandler(new \Monolog\Handler\NullHandler());
}

我希望给你一个更适合你使用的例子,但为了知道你如何使用它,我需要看一些代码。

更新

对于有关默认格式的问题,“[]”表示可以在日志条目中添加的额外数据。

来自@Seldaek(Monolog的所有者):

LineFormatter的默认格式为:“[%datetime%]%channel%。%level_name%:%message%%context%%extra%\ n”。用户名/年龄是上下文,通常为空的额外信息会导致此空数组[]。

如果您使用处理器附加数据到日志记录,则它们通常将其写入extra键,以避免与上下文信息发生冲突。如果这确实是对您有影响的问题,您可以更改默认格式并省略%extra%。

编辑:从Monolog 1.11开始,LineFormatter在构造函数中具有$ignoreEmptyContextAndExtra参数,使您可以删除它们,因此您可以使用以下内容:

// 这里的最后一个“true”告诉它删除空的[]

$formatter = new LineFormatter(null,null,false,true);
$handler-> setFormatter($ formatter);

关于@Seldaek所说的处理器,请参见How not to show last bracket in a monolog log line?Symfony2:在不同文件中记录日志时使用处理器


1
我觉得我读得太快了。你根本不想禁用调试,只是要改变调试级别吗? - chalasr
1
你使用的方式很简洁,而且如果它符合你的需求,为什么不呢? - chalasr
1
我认为它看起来不错,但不幸的是(或者根据您的喜好,幸运的是),我没有和任何一个在这个水平上考虑 PHP 的人一起工作。因此,我并不总是知道自己是否遗漏了什么或者是否以不太好的方式进行了某些操作。 - Halfstop
1
目前我没有看到任何优化你的逻辑的方法,也许其他人会给你更多意见。 - chalasr
我对Monolog的默认格式很好奇。[2016-02-24 14:35:59] durp-service.DEBUG:调试已打开[] []那两个括号槽是用来干什么的?如何在其中放置数据或将其删除? - Halfstop
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接