log4j rootLogger semble hériter du niveau de journal de autre enregistreur. Pourquoi?
J'ai une configuration de log4J dans lequel la racine enregistreur est censé ERREUR du journal des messages de niveau et au-dessus de la console et un autre enregistreur de logs tout à syslog.
log4j.propriétés:
# Root logger option
log4j.rootLogger=ERROR,R
log4j.appender.R=org.apache.log4j.ConsoleAppender
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d %p %t %c - %m%n
log4j.logger.SGSearch=DEBUG,SGSearch
log4j.appender.SGSearch=org.apache.log4j.net.SyslogAppender
log4j.appender.SGSearch.SyslogHost=localhost
log4j.appender.SGSearch.Facility=LOCAL6
log4j.appender.SGSearch.layout=org.apache.log4j.PatternLayout
log4j.appender.SGSearch.layout.ConversionPattern=[%-5p] %m%n
Dans le code je ne
private static final Logger logger = Logger.getLogger("SGSearch");
.
.
.
logger.info("Commencing snapshot index [" + args[1] + " -> " + args[2] + "]");
Ce qui se passe c'est que je la journalisation de la console pour tous les niveaux d'enregistrement. Ce qui semble se passer, c'est que le niveau de SGSearch remplace le paramètre de niveau de la racine de l'enregistreur de quelque sorte. Je ne peux pas le comprendre.
J'ai confirmé que Log4J est de lire le fichier de propriétés, je pense qu'il est, et pas d'autres (via le -Dlog4j.debug
option)
- J'ai rencontré ce même problème/de la confusion. Voir stackoverflow.com/questions/3023690/....
Vous devez vous connecter pour publier un commentaire.
La façon Log4j le chaînage de œuvres est un peu contre-intuitif (pour moi au moins). Voir le manuel de log4j. Si le niveau de la demande est égale à ou au-dessus du seuil de la plus spécifique correspondant enregistreur, il est accepté. Une fois que la demande est acceptée, elle est prise en charge par l'ensemble de la chaîne des ancêtres, indépendamment de leurs seuils de!
À réprimer le comportement de chaînage, ajouter:
Ce sera la cause de demandes traitées par l'enregistreur de SGSearch de ne plus être passé en haut de la chaîne.
Une autre suggestion: ne pas le nom de votre enregistreur et appender le même, car à un certain moment dans le futur, vous, ou un collègue se mélanger. Le nom de l'enregistreur doit indiquer le type de journalisation est manipulé, l'appender nom devrait préciser l'endroit où l'enregistrement va. Donc dans ce cas je pense que 'SGSearch" pourrait être le nom de l'enregistreur, et l'appender doit être appelé quelque chose comme "LocalSysLog'.
BTW: À mon avis, vous faites la bonne chose en limitant la racine de l'enregistreur avec un seuil élevé, et de l'abaisser pour certains enregistreurs de frappe. Cela évite l'encombrement de fort bibliothèques (Apache a quelques notoire ceux).
Rapide d'informations sur les Niveaux de
J'ai changé d'exemple de configuration log4j travailler de cette façon:
J'espère que cela vous aide.
log4j.appender.SGSearch.Threshold=ALL
mais alors ce serait fairelog4j.rootLogger
inutile (si je ne me trompe pas).de fixer le seuil par appender base est la clé ici:
log4j.appender.SGSearch.Threshold=DEBUG
et
log4j.appender.R.Threshold=ERROR
c'est une solution bien meilleure que la suggestion de désactiver "additivité" - le problème c'est que tout ce que vous voulez plusieurs appenders à gérer sera vaincu par elle - alors vous ne pouvez pas, par exemple, envoyer quoi que ce soit qui est un
ERROR
niveau message à les deux la console et syslog si vous définissez l'additivité defalse
...