log4php logger-> setLevel()不起作用

时间:2013-06-10 22:06:08

标签: php log4php

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

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

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

这将打印:

DEBUG - debug
INFO - info
WARN - warn
我必须做一些明显愚蠢的事情!我认为调试和信息记录都不会通过setLevel()来报警。

思想?

我想有多个记录器,每个记录器都在不同级别进行记录。不知道为什么这么难......

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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

$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文档的this section中描述的方法一次配置它们。