2010-12-11 2 views
12

J'ai un problème, je veux changer le niveau de journalisation de log4j à l'exécution, j'ai essayé beaucoup de choses avec le fichier log4j.properties, j'ai également essayé d'écrire un code qui après un certain temps, lit à nouveau le fichier de propriétés et configure à nouveau l'enregistreur.pouvons-nous changer le niveau de journalisation de log4j à l'exécution

mais le problème est, je veux changer le niveau de journalisation à DEBUG pour un appel API, puis lorsque cet appel est terminé, l'enregistreur devrait à nouveau changer à la valeur précédente ..

s'il vous plaît aider ..

Répondre

16

appel de la méthode Logger.setLevel avec la Level souhaitée peut modifier un niveau de sortie de Logger à l'exécution.

Voici un exemple qui démontre son utilisation:

Logger logger = Logger.getLogger("myLogger"); 
logger.addAppender(new ConsoleAppender(new SimpleLayout())); 

System.out.println("*** The current level will be INFO"); 

logger.setLevel(Level.INFO); 
logger.warn("Only INFO and higher will appear"); 
logger.info("Only INFO and higher will appear"); 
logger.debug("Only INFO and higher will appear"); 

System.out.println("*** Changing level to DEBUG"); 

// remember the previous level 
Level previousLevel = logger.getLevel(); 

logger.setLevel(Level.DEBUG); 
logger.warn("DEBUG and higher will appear"); 
logger.info("DEBUG and higher will appear"); 
logger.debug("DEBUG and higher will appear"); 

System.out.println("*** Changing level back to previous level"); 

// revert to previous level 
logger.setLevel(previousLevel); 
logger.warn("Only INFO and higher will appear"); 
logger.info("Only INFO and higher will appear"); 
logger.debug("Only INFO and higher will appear"); 

Les sorties ci-dessus:

*** The current level will be INFO 
WARN - Only INFO and higher will appear 
INFO - Only INFO and higher will appear 
*** Changing level to DEBUG 
WARN - DEBUG and higher will appear 
INFO - DEBUG and higher will appear 
DEBUG - DEBUG and higher will appear 
*** Changing level back to previous level 
WARN - Only INFO and higher will appear 
INFO - Only INFO and higher will appear 

Ce qui précède démontre comment changer le niveau d'un Logger nommé myLogger, mais si les niveaux de tous les enregistreurs dans le référentiel actuel doit être changé, puis la méthode setLevel sur le root logger obtenu par Logger.getRootLogger sho Vous serez appelé à changer les niveaux sur tous les enregistreurs enfants.

8

Le niveau de journalisation d'un enregistreur peut être modifié en appelant setLevel comme décrit par @coobird. Cependant, il y a un hic!

Lorsque vous appelez getLogger(name), la bibliothèque de journalisation vous renvoie un objet existant Logger si possible. Si deux threads ou plus demandent un logger avec le même nom, ils auront le même objet. Si l'un des threads appelle setLevel, cela modifie le niveau de journalisation pour tous les autres. Cela peut conduire à un comportement inattendu.

Si vous avez vraiment besoin de faire ce genre de chose, une meilleure approche serait de créer un enregistreur avec un nom différent pour le cas où vous voulez vous connecter à un niveau différent.

Cependant, je ne suis pas convaincu de la sagesse de l'application appelant setLevel du tout. La méthode setLevel consiste à filtrer les messages du journal et vous ne devez pas supprimer le contrôle du filtrage de journalisation de l'utilisateur/déployeur.

1

Je pense qu'il est logique d'appeler setLevel si un serveur a un thread "Controller". De cette façon, vous pouvez modifier dynamiquement le niveau de consignation au moment de l'exécution pour déboguer un problème et le modifier lorsque vous avez terminé.

Mais je ne sais pas ce qui se passe quand il est appelé à partir d'un thread séparé.

+0

Cela devrait être un commentaire, pas une réponse.Essayez de répondre aux questions dont vous connaissez la réponse afin de pouvoir faire des commentaires! – durron597

-1

méthode setLevel est là que pour java.util.logging.Logger et non pour org.apache.logging.log4j.Logger

Voilà comment nous fixons log niveau apache log4j

org.apache.logging.log4j.core.LoggerContext 
ctx = (LoggerContext) LogManager.getContext(false); 
org.apache.logging.log4j.core.config.Configuration 
conf = ctx.getConfiguration(); 
conf.getLoggerConfig(LogManager.ROOT_LOGGER_NAME).setLevel(Level.DEBUG); 
ctx.updateLoggers(conf); 
Questions connexes