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() が存在することを警告するために、デバッグも情報ログも通過しないと思います。

考え?

それぞれが異なるレベルでログを記録する複数のロガーが必要です。なぜこれが難しいのかわかりません...

4

1 に答える 1

3

Logger作成されたオブジェクトを ( で初期化した後に)チェックするLogger::getLogger("test");と、すでに親 Logger があることがわかります object(LoggerRoot)。このオブジェクトのレベルは に設定されており、これはDEBUG実際にはdebugおよびinfoメッセージを出力するロガーです。

可能なアプローチの 1 つは、代わりに RootLogger を使用することです。

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

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

もう 1 つの方法は、rootLogger を構成して、非常に高いレベル ( FATAL) のメッセージのみをログに記録し、ロガーが適切なレベルを設定できるようにすることです。ただし、その場合は、独自のアペンダーをそれらに追加する必要があります (ロギング ジョブを実行するのはアペンダーです。ロガーはそれらを管理するだけです)。繰り返しますが、1 つの可能なアプローチ:

$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 に答える