2013-06-10 1 views
1

Je ne sais pas pourquoi cette chose très simple ne fonctionne pas -log4php logger-> setLevel() ne fonctionne pas

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

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

Ce imprimera:

DEBUG - debug 
INFO - info 
WARN - warn 

Je dois faire quelque chose de toute évidence stupide! Je supposerais que ni le débogage ni la journalisation d'information ne viendraient avec le setLevel() pour avertir était présent.

Pensées?

Je voudrais avoir plusieurs enregistreurs qui se connectent chacun à différents niveaux. Je ne sais pas pourquoi cela est si difficile ...

+1

désolé, j'aurais dû être plus précis. Je veux que cela se passe sur stdout, mon souci est qu'il ignore la requête setLevel() et l'impression de la journalisation de niveau debug() et info() même si le niveau est défini sur Warn. – user645402

Répondre

3

Si vous cochez l'objet créé Logger (après l'initialisation avec Logger::getLogger("test");), vous verrez qu'il a déjà un enregistreur de parent, object(LoggerRoot). Cet objet a son niveau défini sur DEBUG, et c'est en fait l'enregistreur qui imprime les messages debug et info.

Une approche possible est d'utiliser un RootLogger à la place:

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

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

Une autre approche consiste à configurer rootLogger afin qu'il enregistre uniquement les messages de certains très haut niveau (FATAL), et laissez vos enregistreurs pour définir les niveaux approprié pour eux. Mais dans ce cas, vous devez ajouter vos propres appenders à ceux-ci (c'est les appenders qui font le travail de journalisation, les loggers les gèrent simplement). Encore une fois, une approche possible:

$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 

Mais vous avez réellement besoin d'une hiérarchie complexe de bûcherons, je serais suggère fortement de les configurer à la fois, suivant la méthode décrite dans this section de la documentation log4php.

+0

Cela ne fonctionne pas (excusez la mise en forme) - Logger :: getRootLogger() -> setLevel (LoggerLevel :: getLevelFatal()); $ logger = Logger :: getLogger ("test"); $ logger-> setLevel (LoggerLevel :: getLevelInfo()); $ logger-> debug ("debug"); $ logger-> info ("info"); $ logger-> warn ("warn"); – user645402

+0

Mise à jour de mon exemple. En fait, dans votre cas, il peut être judicieux d'utiliser la méthode 'Logger :: configure' pour configurer tous les journaux simultanément. – raina77ow

Questions connexes