Comment configurer Logback pour enregistrer différents niveaux pour un enregistreur vers différentes destinations?

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

  • cliquez sur des trucs pour m’emmener aux déclarations de journal et
  • voir info et ci-dessous en noir et avertir / sévère en rouge

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 System.err 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