Comment configurer Logback pour enregistrer différents niveaux pour un enregistreur vers différentes destinations?
Par exemple, compte tenu de la configuration de consignation suivante, la fonction de consignation enregistrera-t-elle les messages INFO
messages STDOUT
et ERROR
sur STDERR
?
(Notez que cet exemple est une variante de l’exemple logback-examples/src/main/java/chapters/configuration/sample4.xml
présenté dans le Chapitre 3: Configuration de la journalisation ).
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n System.err
Mise à jour: Pour une approche basée sur toutes les configurations utilisant Groovy, voir la réponse de Dean Hiller .
–
Vous pouvez faire des choses intéressantes avec les filtres de récupération . La configuration ci-dessous n’imprimera que des messages d’avertissement et d’erreur sur stderr, et tout le rest sur stdout.
logback.xml
System.out ... System.err ...
com.foo.StdOutFilter
public class StdOutFilter extends ch.qos.logback.core.filter.AbstractMatcherFilter { @Override public FilterReply decide(Object event) { if (!isStarted()) { return FilterReply.NEUTRAL; } LoggingEvent loggingEvent = (LoggingEvent) event; List eventsToKeep = Arrays.asList(Level.TRACE, Level.DEBUG, Level.INFO); if (eventsToKeep.contains(loggingEvent.getLevel())) { return FilterReply.NEUTRAL; } else { return FilterReply.DENY; } } }
com.foo.ErrOutFilter
public class ErrOutFilter extends ch.qos.logback.core.filter.AbstractMatcherFilter { @Override public FilterReply decide(Object event) { if (!isStarted()) { return FilterReply.NEUTRAL; } LoggingEvent loggingEvent = (LoggingEvent) event; List eventsToKeep = Arrays.asList(Level.WARN, Level.ERROR); if (eventsToKeep.contains(loggingEvent.getLevel())) { return FilterReply.NEUTRAL; } else { return FilterReply.DENY; } } }
Je pense que ce serait la solution la plus simple:
selenium-plugin System.out INFO ACCEPT DENY [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%level] %msg%n System.err ERROR ACCEPT DENY [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%level] [%thread] %logger{10} [%file:%line] %msg%n
ok, voici ma façon de faire XML préférée. Je le fais pour la version eclipse donc je peux
et pour une raison quelconque SO ne montre pas tout cela correctement mais la plupart semble être là …
e.level.toInt() <= INFO.toInt() DENY NEUTRAL %date{ISO8601} %X{sessionid}-%X{user} %caller{1} %-4level: %message%n warn %date{ISO8601} %X{sessionid}-%X{user} %caller{1} %-4level: %message%n System.err
Solution basée uniquement sur la configuration, avec ThresoldFilter et LevelFilters pour simplifier la compréhension:
System.err WARN %date %level [%thread] %logger %msg%n System.out DEBUG ACCEPT INFO ACCEPT TRACE ACCEPT WARN DENY ERROR DENY %date %level [%thread] %logger %msg%n
La solution la plus simple consiste à utiliser ThresholdFilter
sur les appenders:
INFO
Exemple complet:
INFO %d %-5level: %msg%n ERROR System.err %d %-5level: %msg%n
Mise à jour: Comme Mike l’a souligné dans le commentaire, les messages avec le niveau ERROR sont imprimés ici à la fois sur STDOUT et STDERR. Je ne sais pas quelle était l’intention du PO, cependant. Vous pouvez essayer la réponse de Mike si ce n’est pas ce que vous vouliez.
C’est la configuration que j’utilise, qui fonctionne bien, elle est basée sur XML + JaninoEventEvaluator (nécessite que la bibliothèque Janino soit ajoutée à Classpath)
%date | [%-5level] in [%file:%line] - %msg %n level <= INFO DENY NEUTRAL System.err %date | [%-5level] in [%file:%line] - %msg %n WARN
J’utilise logback.groovy pour configurer ma logback mais vous pouvez aussi le faire avec xml config:
import static ch.qos.logback.classic.Level.* import static ch.qos.logback.core.spi.FilterReply.DENY import static ch.qos.logback.core.spi.FilterReply.NEUTRAL import ch.qos.logback.classic.boolex.GEventEvaluator import ch.qos.logback.classic.encoder.PatternLayoutEncoder import ch.qos.logback.core.ConsoleAppender import ch.qos.logback.core.filter.EvaluatorFilter def patternExpression = "%date{ISO8601} [%5level] %msg%n" appender("STDERR", ConsoleAppender) { filter(EvaluatorFilter) { evaluator(GEventEvaluator) { expression = 'e.level.toInt() >= WARN.toInt()' } onMatch = NEUTRAL onMismatch = DENY } encoder(PatternLayoutEncoder) { pattern = patternExpression } target = "System.err" } appender("STDOUT", ConsoleAppender) { filter(EvaluatorFilter) { evaluator(GEventEvaluator) { expression = 'e.level.toInt() < WARN.toInt()' } onMismatch = DENY onMatch = NEUTRAL } encoder(PatternLayoutEncoder) { pattern = patternExpression } target = "System.out" } logger("org.hibernate.type", WARN) logger("org.hibernate", WARN) logger("org.springframework", WARN) root(INFO,["STDERR","STDOUT"])
Je pense que l'utilisation de GEventEvaluator est plus simple car il n'est pas nécessaire de créer des classes de filtres.
Je m'excuse pour mon anglais!
Essaye ça. Vous pouvez simplement utiliser ThresholdFilter
et LevelFilter
. Pas besoin de créer vos propres filtres par programmation. Dans cet exemple, les niveaux WARN et ERROR sont enregistrés dans System.err et restnt sur System.out:
ERROR DENY WARN DENY System.out true utf-8 ${msg_pattern} WARN System.err true utf-8 ${msg_pattern}
Je ne prends aucun crédit pour cette réponse, car elle est simplement une combinaison des deux meilleures réponses ci-dessus: celle de X. Wo Satuk et celle de Sébastien Helbert: ThresholdFilter
est adorable mais vous ne pouvez pas le configurer pour avoir un niveau supérieur. un niveau inférieur *, mais en le combinant avec deux LevelFilters
réglés sur “DENY” WARN
et ERROR
fonctionne comme un régal.
Très important : n’oubliez pas la
dans l’appendeur STDERR: mon omission m’a frustré pendant quelques minutes.
INFO WARN DENY ERROR DENY %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36}.%M\(%line\) - %msg%n WARN System.err %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36}.%M\(%line\) - %msg%n
* Cependant, une méthode est utilisée dans l’ API, mais je ne sais pas comment l’utiliser dans ce contexte.
Aucune programmation nécessaire la configuration facilite votre vie
Ci-dessous la configuration qui enregistre différents niveaux de journaux dans différents fichiers
INFO %d{yyyy-MM-dd HH:mm:ss} %-5level - %msg%n ${DEV_HOME}/app-error.log %d{yyyy-MM-dd HH:mm:ss} %-5level - %msg%n ${DEV_HOME}/archived/app-error.%d{yyyy-MM-dd}.%i.log 10MB ERROR ACCEPT DENY ${DEV_HOME}/app-info.log %d{yyyy-MM-dd HH:mm:ss} %-5level - %msg%n ${DEV_HOME}/archived/app-info.%d{yyyy-MM-dd}.%i.log 10MB INFO ACCEPT DENY ${DEV_HOME}/app-debug.log %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n ${DEV_HOME}/archived/app-debug.%d{yyyy-MM-dd}.%i.log 10MB DEBUG ACCEPT DENY ${DEV_HOME}/app.log %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n ${DEV_HOME}/archived/app.%d{yyyy-MM-dd}.%i.log 10MB
${storm.log.dir}/${logfile.name} ${storm.log.dir}/${logfile.name}.%i 1 9 100MB %d{yyyy-MM-dd'T'HH:mm:ss.SSSZZ} %c{1} [%p] %m%n ${storm.log.dir}/access.log ${storm.log.dir}/access.log.%i 1 9 100MB %d{yyyy-MM-dd'T'HH:mm:ss.SSSZZ} %c{1} [%p] %m%n ${storm.log.dir}/mesortingcs.log ${storm.log.dir}/logs/mesortingcs.log.%i 1 9 2MB %d %-8r %m%n So here is the logback file in which I am not printing backtype.storm.mesortingc.LoggingMesortingcsConsumer info level if i say additivity = "true" then for for all classes in backtype.* this rule will be applied
Exemple de sortie de messages colorés de niveau “INFO” ou supérieur à la console et des messages de niveau “WARN” ou supérieur à classer .
Votre fichier logback.xml :
INFO %d{yyyy-MMM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{15}) - %msg %n myfile.log WARN true %d{yyyy-MMM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} - %msg%n