不确定为什么这个非常简单的事情不起作用 -
$logger = Logger::getLogger("test");
$logger->setLevel(LoggerLevel::getLevelWarn());
$logger->debug("debug");
$logger->info("info");
$logger->warn("warn");
这将打印:
DEBUG - debug
INFO - info
WARN - warn
我必须做一些明显愚蠢的事情!我认为调试和信息记录都不会通过setLevel()来报警。
思想?
我想有多个记录器,每个记录器都在不同级别进行记录。不知道为什么这么难......
答案 0 :(得分:3)
如果您检查创建的Logger
对象(使用Logger::getLogger("test");
初始化后),您将看到它已经有一个父记录器object(LoggerRoot)
。此对象的级别设置为DEBUG
,实际上是打印debug
和info
消息的记录器。
一种可能的方法是使用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中描述的方法一次配置它们。