Log4j: plusieurs enregistreurs, niveaux et appenders

J'ai des problèmes avec les messages de journal en double lors de l'écriture dans plusieurs fichiers journaux en utilisant log4j.

, À l'heure actuelle, je suis en train de log INFO niveau des données (et plus) pour le bûcheron nommé foobar mon foo.log fichier, puis tous les WARN niveau des messages de journal (et plus) de tous les enregistreurs dans le bar.log fichier.

À la suite de cela, les messages de journal en double ont été écrits dans le fichier foo.log (chaque ligne a été enregistrée deux fois) et après quelques recherches rapides, Je trouvé que la suggestion de résoudre ce problème était d'ajouter log4j.additivity.foobar=false à mon fichier de propriétés.

Le problème avec ceci est que bien qu'il arrête les lignes en double, le message WARNde l'enregistreur foobar ne sont jamais écrits dans le fichier bar.log.

Mon fichier de propriétés log4j est le suivant:

log4j.rootLogger = WARN, FOO, BAR
log4j.logger.foobar = INFO, FOO
log4j.additivity.foobar = false

log4j.appender.FOO = org.apache.log4j.RollingFileAppender
log4j.appender.FOO.layout = org.apache.log4j.PatternLayout
log4j.appender.FOO.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n
log4j.appender.FOO.File = foo.log

log4j.appender.BAR = org.apache.log4j.RollingFileAppender
log4j.appender.BAR.layout = org.apache.log4j.PatternLayout
log4j.appender.BAR.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n
log4j.appender.BAR.File = bar.log

Est-ce que quelqu'un sait comment je peux écrire les messages de journal dans les deux fichiers journaux (comme c'était le cas avant que je commence à définir la propriété additivity) et empêche toujours le journal en double les messages?

veuillez noter qu'il s'agit d'un résumé simplifié du problème. Dans le scénario du monde réel, il y a plusieurs enregistreurs et plus de deux fichiers journaux

40
demandé sur My Head Hurts 2012-11-29 17:48:51

1 réponses

Ce problème peut être résolu en deux parties.

1. Empêcher les messages de journal en double

Les messages du journal ont été écrits deux fois parce que nous avons listé le FOO appender dans le rootLogger et le log4j.logger.foobar catégorie. Nous devons donc supprimer l'appender et définir uniquement le niveau de journalisation dans category:

log4j.rootLogger = WARN, FOO, BAR
log4j.logger.foobar = INFO

Cela signifie que les messages de niveau INFO de log4j.logger.foobar sont propagées vers le haut à tous les enregistreurs de la appenders dans rootLogger, mais ne seront écrites dans chaque fichier journal une fois.

2. Empêcher le message de niveau D'information d'être écrit à la barre.log

Depuis tous les messages du journal de niveau INFO pour le log4j. logger.la catégorie foobar est héritée par les appenders dans rootLogger , nous devons arrêter l'appender BAR pour enregistrer les messages de niveauINFO .

Nous pouvons y parvenir en définissant le seuil propriété sur la barre Annexe elle-même:

log4j.appender.BAR.Threshold = WARN

Cela empêchera les instructions de niveauINFO d'être enregistrées dans la barre .enregistrez le fichier car il n'acceptera que les niveaux de WARN et plus.

Donc, le fichier de propriétés log4j complet serait comme suit:

log4j.rootLogger = WARN, FOO, BAR
log4j.logger.foobar = INFO

log4j.appender.FOO = org.apache.log4j.RollingFileAppender
log4j.appender.FOO.layout = org.apache.log4j.PatternLayout
log4j.appender.FOO.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n
log4j.appender.FOO.File = foo.log
log4j.appender.FOO.Threshold = INFO

log4j.appender.BAR = org.apache.log4j.RollingFileAppender
log4j.appender.BAR.layout = org.apache.log4j.PatternLayout
log4j.appender.BAR.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n
log4j.appender.BAR.File = bar.log
log4j.appender.BAR.Threshold = WARN
56
répondu My Head Hurts 2012-11-30 10:46:11