web-dev-qa-db-fra.com

Comment puis-je accéder aux appenders Log4J configurés au moment de l'exécution?

Je souhaite configurer un appender au démarrage, puis l'ajouter et le supprimer dynamiquement de divers enregistreurs à la demande. Je préférerais que log4j configure lui-même cet appender, et saisisse simplement une référence à celui-ci en cas de besoin. Si ce n'est pas possible, je devrai instancier moi-même le correcteur et le conserver.

38
Seth Weiner

Les appendices sont généralement ajoutés à l'enregistreur racine. Voici un pseudocode

// get the root logger and remove the appender we want
Logger logger = Logger.getRootLogger();
Appender appender = logger.getAppender("foo");
logger.removeAppender(appender)

// when we want to add it back...
logger.addAppender(appender);

Je suis presque sûr que vous pouvez le faire sur d'autres enregistreurs que l'enregistreur racine également, bien que je n'ai jamais essayé.

24
Alan Krueger

Je veux faire exactement la même chose. Je souhaite configurer les appenders dans log4j.properties, puis en sélectionner et en ajouter dynamiquement le rootLogger au moment de l'exécution.

Je n'arrivais pas à comprendre comment accéder aux appenders autrement que via un enregistreur auquel ils avaient été attachés. J'ai donc fini par créer un enregistreur factice et y attacher les appendeurs afin que je puisse les récupérer dynamiquement. Cela n’est cependant pas idéal, car les ressources utilisées par les ajouts (fichiers, par exemple) sont créées d’avance, même si elles ne sont pas utilisées.

3
Joel

Le Logger class a des méthodes pour getAllAppenders () , getAppender () , addAppender () et removeAppender () méthodes, héritées de la catégorie classe. Cependant, la classe Category est obsolète et, en plus, je n’avais jamais essayé de le faire auparavant, mais cela pourrait être un point de départ utile.

3
Thomas Owens

Si vous souhaitez activer/désactiver les appendices au moment de l'exécution, j'ai trouvé une autre solution (bien que pas très élégante). En utilisant la configuration de log4j, ajoutez tous les appendices dont vous auriez besoin comme vous le faites normalement.

Au moment de l'exécution, lorsque vous souhaitez "désactiver" un éditeur, ajoutez-y un filtre (org.Apache.log4j.spi) qui renvoie Filter.DENY pour chaque message du journal. De cette façon, aucun message ne parviendra à cet Appender. Lorsque vous souhaitez "activer" Appender, effacez simplement le filtre que vous avez ajouté ci-dessus.

J'ai testé cela et cela fonctionne bien pour nous (log4j 1.2).

0
nLogN

Je le ferais de cette façon:

  1. avez-vous appender spécifié dans log4j.properties, mais pas ajouté à root logger.
  2. au moment de l'exécution, au besoin, récupérez log4j.properties, extrayez-y les propriétés dont vous avez besoin, instanciez votre appender et définissez ses options en lisant les propriétés extraites. 
  3. activer l'appender
  4. Logger.getRootLogger (). AddAppender (appender);
  5. Lancez-le lorsque vous avez fini de l'utiliser - Logger.getRootLogger (). RemoveAppender (..)

Maintenant, s’il s’agit de votre propre corrélateur, il serait facile de faire (2) puisque vous connaissez le sens des propriétés et savez à quoi vous attendre. Sinon, vous voudrez probablement utiliser la réflexion pour instancier la classe et appeler ses paramètres de propriété avant de faire (3).

0
Dima