1

不知道为什么这个非常简单的事情不起作用 -

$logger = Logger::getLogger("test");
$logger->setLevel(LoggerLevel::getLevelWarn());

$logger->debug("debug");
$logger->info("info");
$logger->warn("warn");

这将打印:

DEBUG - debug
INFO - info
WARN - warn

我一定是在做一些明显愚蠢的事情!我会假设调试和信息日志都不会通过 setLevel() to warn 存在。

想法?

我希望有多个记录器,每个记录器都记录在不同的级别。不知道为什么这么难……

4

1 回答 1

3

如果您检查创建的Logger对象(在使用 初始化它之后Logger::getLogger("test");),您会看到它已经有一个父 Logger object(LoggerRoot),. 该对象的级别设置为DEBUG,这实际上是打印debuginfo消息的记录器。

一种可能的方法是使用 RootLogger 代替:

$logger = Logger::getRootLogger();
$logger->setLevel(LoggerLevel::getLevelWarn());

$logger->debug("debug");
$logger->info("info");
$logger->warn("warn");

另一种方法是配置 rootLogger 以便它只记录一些非常高级别 ( FATAL) 的消息,并让您的记录器设置适合它们的级别。但是在这种情况下,您需要将自己的附加程序添加到那些(执行日志记录工作的是附加程序;记录器只是管理它们)。同样,一种可能的方法:

$rootLogger = Logger::getRootLogger();
$rootLogger->setLevel(LoggerLevel::getLevelFatal());

$logger = Logger::getLogger('some');
$logger->addAppender($rootLogger->getAppender('default'));
$logger->setLevel(LoggerLevel::getLevelInfo());

$logger->debug('debug');   // won't print
$logger->info('info');     // will be printed
$logger->warn('warn');     // will be printed too

$logger->fatal('fatal dup');   // will be printed TWICE: 
                               // with $logger, then with $rootLogger

$logger->setAdditivity(false); // switching off log event propagation
$logger->fatal('fatal once');  // will be printed ONCE 

但如果您实际上需要一个复杂的记录器层次结构,我强烈建议您按照log4php 文档本节中描述的方法一次配置它们。

于 2013-06-10T22:24:01.293 回答