如何使用 Monolog 关闭调试日志

How to Turn off Debugging Logs with Monolog

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

我想做的是以编程方式关闭调试日志。我正在写入日志文件,并且正在使用 Monolog::StreamHandler。我正在使用从配置文件获取调试值的 Configuration class 来控制应用程序是否处于调试模式。因此,当有人将该值更改为 debugging is 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,则只需 return 而不写入日志消息。否则,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,则不会记录 "Debugging enabled" 消息。

愿意接受改进建议。

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

也许可以根据您的情况在它们之间切换,如下所示:

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

我想给你一个更适合你用法的例子,
但我需要查看一些代码才能了解您如何使用它。

更新

关于默认格式的问题,末尾的空[]表示可以用日志条目添加的额外数据。

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

The default format of the LineFormatter is: "[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n". the username/age is the context, and extra that is typically empty results in this empty array [].

If you use processors to attach data to log records they typically write it to the extra key to avoid conflicts with context info. If it really is an issue for you you can change the default format and omit %extra%.

Edit: As of Monolog 1.11 the LineFormatter has a $ignoreEmptyContextAndExtra parameter in the constructor that lets you remove these, so you can use this:

// 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? and Symfony2 : use Processors while logging in different files 了解@Seldaek 正在谈论的处理器。