J'essaye d'utiliser SLF4J (avec log4j
liaison) pour la première fois.
Je voudrais configurer 3 enregistreurs nommés différents qui peuvent être retournés par un LoggerFactory qui enregistrera différents niveaux et enverra les messages à différents appenders:
- Logger 1 "FileLogger" enregistre DEBUG et ajoute à
DailyRollingFileAppender
- Logger 2 "TracingLogger" enregistre TRACE + et ajoute à un
JmsAppender
- Logger 3 "ErrorLogger" enregistre ERROR + et ajoute à un autre
JmsAppender
De plus, je veux qu'ils soient configurés par programme (en Java, par opposition à XML ou à un log4j.properties
fichier).
J'imagine que, normalement, je définirais ces Logger
s quelque part dans un code d'amorçage, comme une init()
méthode. Cependant, parce que je veux utiliser slf4j-log4j
, je ne sais pas où je pourrais définir les enregistreurs et les rendre disponibles au chemin de classe.
Je ne pense pas que ce soit une violation de l'objectif sous-jacent de SLF4J (en tant que façade), car mon code utilisant l'API SLF4J ne saura jamais que ces enregistreurs existent. Mon code fait juste des appels normaux à l'API SLF4J, qui les transmet ensuite aux enregistreurs log4j qu'il trouve sur le chemin de classe.
Mais comment configurer ces Log4j Loggers sur le chemin de classe ... en Java?!
Réponses:
Vous pouvez ajouter / supprimer Appender par programme à Log4j:
Je vous suggère de le mettre dans un init () quelque part, où vous êtes sûr, que cela sera exécuté avant toute autre chose. Vous pouvez ensuite supprimer tous les appenders existants sur l'enregistreur racine avec
et commencez par ajouter le vôtre. Vous avez besoin de log4j dans le classpath bien sûr pour que cela fonctionne.
Remarque:
vous pouvez prendre tout
Logger.getLogger(...)
ce que vous voulez pour ajouter des appenders. Je viens de prendre l'enregistreur racine car il est au bas de toutes les choses et gérera tout ce qui est passé par d'autres appenders dans d'autres catégories (sauf configuration contraire en définissant l'indicateur d'additivité).Si vous avez besoin de savoir comment fonctionne la journalisation et comment est décidé où les journaux sont écrits, lisez ce manuel pour plus d'informations à ce sujet.
En bref:
vous donnera un enregistreur pour la catégorie "com.fizz".
Pour l'exemple ci-dessus, cela signifie que tout ce qui y est consigné sera référencé vers la console et l'appender de fichier sur l'enregistreur racine.
Si vous ajoutez un appender à Logger.getLogger ("com.fizz"). AddAppender (newAppender), la journalisation à partir de
fizz
sera gérée par tous les appenders du root logger et dunewAppender
.Vous ne créez pas de Loggers avec la configuration, vous fournissez simplement des gestionnaires pour toutes les catégories possibles de votre système.
la source
Logger fizz = LoggerFactory.getLogger("com.fizz");
Merci!On dirait que vous essayez d'utiliser log4j des «deux extrémités» (la fin du consommateur et la fin de la configuration).
Si vous voulez coder contre l'api slf4j mais déterminez à l'avance (et par programme) la configuration des log4j Loggers que le chemin de classe retournera, vous devez absolument avoir une sorte d'adaptation de journalisation qui utilise une construction paresseuse.
Avec cette approche, vous n'avez pas à vous soucier de l'endroit / du moment où vos enregistreurs log4j sont configurés. La première fois que le classpath les demande, ils sont construits paresseusement, renvoyés et rendus disponibles via slf4j. J'espère que cela a aidé!
la source
Dans le cas où vous avez défini un appender dans les propriétés log4j et souhaitez le mettre à jour par programme, définissez le nom dans les propriétés log4j et obtenez-le par son nom.
Voici un exemple d'entrée log4j.properties:
Pour le mettre à jour, procédez comme suit:
la source
Si quelqu'un cherche à configurer log4j2 par programmation en Java, ce lien pourrait aider: ( https://www.studytonight.com/post/log4j2-programmatic-configuration-in-java-class )
Voici le code de base pour configurer un Appender de console:
Cela reconfigurera le rootLogger par défaut et créera également un nouvel appender .
la source