web-dev-qa-db-fra.com

Comment empêcher logback de générer son propre statut au début de chaque journal?

Cela ressemble à une erreur de négligence, mais je n'arrive pas à en trouver la cause. Journalisation avec logback/slf4j (la version la plus récente, slf4j-api-1.6.1, logback core/classic 0.9.24). La configuration de journal la plus simple pour les tests est:

<configuration>
 <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
  <layout class="ch.qos.logback.classic.PatternLayout">
   <!-- DONT USE THIS FORMATTER FOR LIVE LOGGING THE %L LINE NUMBER OUTPUTTER IS SLOW -->
   <pattern>%le %-1r [%c{1}:%L] %m%n</pattern>
  </layout>
 </appender>
 <root level="DEBUG">
  <appender-ref ref="stdout" />
 </root>
</configuration>

Chaque configuration de journal commence par les lignes d'état internes de logback:

11:21:27,825 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
11:21:27,826 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback-test.xml] at [file:.../logback-test.xml]
11:21:28,116 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
11:21:28,124 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
11:21:28,129 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [stdout]
11:21:28,180 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Pushing component [layout] on top of the object stack.
11:21:28,206 |-WARN in ch.qos.logback.core.ConsoleAppender[stdout] - This appender no longer admits a layout as a sub-component, set an encoder instead.
11:21:28,206 |-WARN in ch.qos.logback.core.ConsoleAppender[stdout] - To ensure compatibility, wrapping your layout in LayoutWrappingEncoder.
11:21:28,206 |-WARN in ch.qos.logback.core.ConsoleAppender[stdout] - See also http://logback.qos.ch/codes.html#layoutInsteadOfEncoder for details
11:21:28,207 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG
11:21:28,207 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [stdout] to Logger[ROOT]

qui est, selon la documentation, le format utilisé par logback pour default. Il termine ensuite la lecture de la configuration (qui est configurée pour produire un format différent) et continue avec la sortie correctement formatée. Il existe un paramètre de configuration <configuration debug="false"> qui n'affecte pas cela. 

Quelqu'un sait comment fermer ça? 

113
Steve B.

Si vous définissez l'attribut debug de l'élément configuration sur true, vous obtiendrez toutes les informations d'état sur la console. Si tel est votre problème, définissez-le simplement sur false ou supprimez-le.

Si vous rencontrez des problèmes de configuration de niveau WARN ou supérieur, vous obtiendrez également toutes les informations d'état consignées sur la console (y compris les messages de niveau INFO). La meilleure solution à ce problème consiste à résoudre le problème (dans votre cas, remplacez l'élément <layout> par un élément <encoder>).

Si, pour une raison quelconque, vous ne pouvez pas résoudre le problème, mais souhaitez supprimer les informations d'état de la console, vous pouvez configurer une alternative StatusListener. Utilisez la NopStatusListener pour supprimer complètement les informations de statut:

<configuration>
  <statusListener class="ch.qos.logback.core.status.NopStatusListener" />
  <!-- etc -->
</configuration>
199
Rasmus Faber

Comme décrit dans la documentation , si des avertissements ou des erreurs se produisent lors de l'analyse du fichier de configuration, la consignation imprimera automatiquement les données d'état sur la console.

Suivez http://logback.qos.ch/codes.html#layoutInsteadOfEncoder i.e. Le lien mentionné par logback dans son message d’avertissement. Une fois que vous avez suivi les étapes mentionnées, c’est-à-dire que si vous remplacez l’élément <layout> par <encoder>, la journalisation cessera d’imprimer des messages sur la console. 

42
Ceki

Ceki réponse est correcte: 

(...) Si des avertissements ou des erreurs se produisent lors de l'analyse du fichier de configuration, logback imprimera automatiquement les données d'état sur la console.

Une fois que vous avez bien compris, il n'y aura plus de pollution dans les premières lignes de votre journal.

Depuis mars 2015, dans Logback 1.1.2, vous devez utiliser le sous-composant <encoder> - <layout> est désormais obsolète et, si vous l'utilisez, des messages d'erreur apparaissent. Vous ne pouvez pas contrôler cela, c'est le comportement par défaut Logback.

Certaines classes internes ont également été renommées et même les exemples de leur page de manuel sont obsolètes!

Voici l'extrait de code de leur page d'aide Codes d'erreur, qui présente la méthode appropriée pour configurer l'enregistreur. Cela corrigeait complètement le problème dans mon projet . http://logback.qos.ch/codes.html#layoutInsteadOfEncoder }

<appender name="FILE" class="ch.qos.logback.core.FileAppender">
  <file>testFile.log</file>
  ...
  <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    <pattern>%msg%n</pattern>
  </encoder>
</appender>
7
cbaldan

J'ai réalisé que Steve avait trouvé le correctif mais il ne l'a pas mentionné dans le fil. Au cas où une autre personne toucherait le même problème, voici le correctif.

Remplacez les éléments "<layout>" par "<encoder> .. </ encoder>" C'est le coupable .. <Layout class = "ch.qos.logback.classic.PatternLayout">

4
Intesar Mohammed

Cela semble être corrigé dans 0.9.29. Je viens de faire plusieurs tests. Plus d'Info Joran. Je suppose que ceci est le dépannage de réparation.

2
Michael-O

J'ai moi-même eu le même problème, c’est-à-dire qu’il y avait un tas de lignes enregistrées dès le début qui n’étaient pas liées à mon code. Voici comment je l'ai corrigé. 

<configuration debug="false">

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level 
        %logger{36} - %msg%n</pattern> </encoder> -->
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} %-5level %logger{10} - %msg%n</pattern>
    </encoder>
</appender>

<root level="error">
    <appender-ref ref="STDOUT" />
</root>

<logger name="fun.n.games" level="DEBUG" />

Ceci est en cours d'exécution avec l'entrée suivante dans le fichier pom.xml 

        <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>
2
kaun jovi

L'utilisation delogback.groovy: statusListener(NopStatusListener)(dans le src/test/resources/logback.groovy) fonctionne.

(Un cas d'utilisation valide est, par exemple, l'utilisation d'ANT dans Eclipse, l'utilisation de la journalisation, des classes groovy et des tests unitaires où les tests unitaires prennent le src/test/resources/logback.groovy, mais verront également le src/main/resources/logback.groovy (ou similaire) que vous ne pouvez pas exclure utiliser le classpath des projets).)

0
Andreas Dietrich

J'ai tout essayé et rien n'a fonctionné pour moi. Mon problème était dû à plusieurs fichiers logback.xml dans mon classpath. C'est le cas habituel dans les projets multi-modulaires . Lorsqu'il n'y a qu'un seul fichier logback.xml dans classpath, il n'y a aucune ambiguïté et le problème est résolu.

0
Filip