gpt4 book ai didi

php - 如何使用 Monolog 关闭调试日志

转载 作者:可可西里 更新时间:2023-11-01 13:44:50 24 4
gpt4 key购买 nike

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

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

更新

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

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,则不会记录“调试已启用”消息。

乐于接受改进建议。

最佳答案

一个常见的替代方法是使用 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?Symfony2 : use Processors while logging in different files关于@Seldaek 正在谈论的处理器。

关于php - 如何使用 Monolog 关闭调试日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35610782/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com