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.
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é.
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.
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.
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).
Je le ferais de cette façon:
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).