Modification dynamic du niveau de log4j log

Quelles sont les différentes approches pour modifier dynamicment le niveau de journalisation de log4j afin de ne pas avoir à redéployer l’application. Les changements seront-ils permanents dans ces cas?

La modification du niveau de consignation est simple. modifier d’autres parties de la configuration posera une approche plus approfondie.

LogManager.getRootLogger().setLevel(Level.DEBUG); 

Les changements sont permanents dans le cycle de vie du Logger . Lors de la réinitialisation, la configuration sera lue et utilisée car la définition du niveau lors de l’exécution ne permet pas de conserver le changement de niveau.

MISE À JOUR: Si vous utilisez Log4j 2, vous devez supprimer les appels à setLevel conformément à la documentation, car cela peut être réalisé via les classes d’implémentation.

Les appels à logger.setLevel () ou à des méthodes similaires ne sont pas pris en charge dans l’API. Les applications doivent les supprimer. Des fonctionnalités équivalentes sont fournies dans les classes d’implémentation Log4j 2 mais peuvent laisser l’application susceptible d’être modifiée par les composants internes de Log4j 2.

Chien de garde

Log4j est capable de regarder le fichier log4j.xml pour les changements de configuration. Si vous modifiez le fichier log4j, log4j actualisera automatiquement les niveaux de journalisation en fonction de vos modifications. Voir la documentation de org.apache.log4j.xml.DOMConfigurator.configureAndWatch(Ssortingng,long ) pour plus de détails. Le temps d’attente par défaut entre les vérifications est de 60 secondes. Ces modifications seraient persistantes, puisque vous modifiez directement le fichier de configuration sur le système de fichiers. Tout ce que vous avez à faire est d’appeler une fois DOMConfigurator.configureAndWatch ().

Attention: la méthode configureAndWatch n’est pas sécurisée pour une utilisation dans des environnements J2EE en raison d’une fuite de thread

JMX

Une autre façon de définir le niveau de journalisation (ou la reconfiguration en général) de log4j consiste à utiliser JMX. Log4j enregistre ses enregistreurs en tant que MBeans JMX. A l’aide des consoles MBeanServer (ou jconsole.exe) du JDK, vous pouvez reconfigurer chaque enregistreur. Ces modifications ne sont pas persistantes et seraient réinitialisées à la configuration définie dans le fichier de configuration après le redémarrage de votre application (serveur).

Fait maison

Comme décrit par Aaron, vous pouvez définir le niveau de journalisation par programmation. Vous pouvez l’implémenter dans votre application comme vous le souhaitez. Par exemple, vous pouvez avoir une interface graphique dans laquelle l’utilisateur ou l’administrateur modifie le niveau de journalisation, puis appelle les méthodes setLevel() sur le consignateur. À vous de décider si vous conservez les parameters quelque part ou non.

Log4j2 peut être configuré pour actualiser sa configuration en analysant le fichier log4j 2 .xml (ou équivalent) à des intervalles donnés. Ajoutez simplement le paramètre ” monitorInterval ” à votre balise de configuration. Voir la ligne 2 de l’exemple de fichier log4j 2 .xml, qui indique à log4j de réexaminer sa configuration si plus de 5 secondes se sont écastings depuis le dernier événement de journal.

 < ?xml version="1.0" encoding="UTF-8" ?>       ...         

Je l’ai fait pour changer dynamicment le niveau de log4j et cela a fonctionné pour moi, je n’ai renvoyé aucun document. J’ai utilisé cette valeur de propriété système pour définir mon nom de fichier journal. J’ai utilisé la même technique pour définir le niveau de consignation et cela a fonctionné

passé ce comme paramètre JVM (j’utilise Java 1.7)

 java -Dlogging.level=DEBUG -cp xxxxxx.jar xxxxx.java 

dans le fichier log4j.properties, j’ai ajouté cette entrée

 log4j.rootLogger=${logging.level},file,stdout 

j’ai essayé

  java -Dlogging.level=DEBUG -cp xxxxxx.jar xxxxx.java java -Dlogging.level=INFO-cp xxxxxx.jar xxxxx.java java -Dlogging.level=OFF -cp xxxxxx.jar xxxxx.java 

Tout a fonctionné. J’espère que cela t’aides!

J’ai ces dépendances suivantes dans mon pom.xml

  log4j log4j 1.2.17   log4j apache-log4j-extras 1.2.17  

Avec log4j 1.x, je trouve que le meilleur moyen est d’utiliser un DOMConfigurator pour soumettre un ensemble prédéfini de configurations de journaux XML (par exemple, un pour un usage normal et un pour le débogage).

Cela peut se faire avec quelque chose comme ceci:

  public static void reconfigurePredefined(Ssortingng newLoggerConfigName) { Ssortingng name = newLoggerConfigName.toLowerCase(); if ("default".equals(name)) { name = "log4j.xml"; } else { name = "log4j-" + name + ".xml"; } if (Log4jReconfigurator.class.getResource("/" + name) != null) { Ssortingng logConfigPath = Log4jReconfigurator.class.getResource("/" + name).getPath(); logger.warn("Using log4j configuration: " + logConfigPath); try (InputStream defaultIs = Log4jReconfigurator.class.getResourceAsStream("/" + name)) { new DOMConfigurator().doConfigure(defaultIs, LogManager.getLoggerRepository()); } catch (IOException e) { logger.error("Failed to reconfigure log4j configuration, could not find file " + logConfigPath + " on the classpath", e); } catch (FactoryConfigurationError e) { logger.error("Failed to reconfigure log4j configuration, could not load file " + logConfigPath, e); } } else { logger.error("Could not find log4j configuration file " + name + ".xml on classpath"); } } 

Appelez simplement ceci avec le nom de configuration approprié et assurez-vous de placer les modèles sur le chemin de classe.

Si vous souhaitez modifier le niveau de journalisation de tous les enregistreurs, utilisez la méthode ci-dessous. Cela énumérera tous les enregistreurs et modifiera le niveau de journalisation à un niveau donné. Assurez-vous que la propriété log4j.appender.loggerName.Threshold=DEBUG n’est pas définie dans votre fichier log4j.properties .

 public static void changeLogLevel(Level level) { Enumeration< ?> loggers = LogManager.getCurrentLoggers(); while(loggers.hasMoreElements()) { Logger logger = (Logger) loggers.nextElement(); logger.setLevel(level); } } 

Vous pouvez utiliser l’extrait de code suivant

 ((ch.qos.logback.classic.Logger)LoggerFactory.getLogger(packageName)).setLevel(ch.qos.logback.classic.Level.toLevel(logLevel));