【问题标题】:How to Turn off Debugging Logs with Monolog如何使用 Monolog 关闭调试日志
【发布时间】:2016-06-07 06:03:16
【问题描述】:

我在一个项目中使用 Monolog,它不是 Symfony,只是我自己的应用程序,它使用了独立的 Monolog composer 包。

我想做的是以编程方式关闭调试日志。我正在写入日志文件,并且正在使用 Monolog::StreamHandler。我正在使用从配置文件获取调试值的配置类来控制应用程序是否处于调试模式。因此,当有人将该值更改为调试为 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 是否最有意义?

更新

现在,我在想这样的事情,它使用级别而不是布尔调试。

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 处理文件写入内容,所以这就是我扩展它的原因。如果我将配置中的日志级别设置为 Logger::INFO,则不会记录“启用调试”消息。

欢迎提出改进建议。

【问题讨论】:

    标签: php symfony debugging monolog


    【解决方案1】:

    一个常见的替代方法是使用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);

    请参阅How not to show last bracket in a monolog log line?Symfony2 : use Processors while logging in different files,了解@Seldaek 所谈论的处理器。

    【讨论】:

    • 我更新了问题以包含对这个问题的进一步想法。
    • 我觉得我读得太快了。您根本不想禁用调试,只需更改调试级别?
    • 你使用的方式很干净,如果它适合你的需要,为什么不呢。
    • 我认为它看起来不错,但不幸的是,或者幸运的是,取决于您的偏好,我不与任何在这个级别考虑 PHP 的人合作。所以我并不总是知道我是否遗漏了什么或以不是最好的方式做某事。
    • 好吧,我目前看不出有什么方法可以优化你的逻辑,也许其他人会给你更多的输入
    猜你喜欢
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 2015-05-06
    • 2012-04-24
    • 2021-04-16
    • 2019-08-07
    相关资源
    最近更新 更多