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

145

Cela semble être une erreur de négligence, mais je n'arrive pas à trouver la cause. Journalisation avec logback / slf4j (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 par défaut. 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 y a un paramètre de configuration <configuration debug="false">qui n'affecte pas cela.

Quelqu'un sait comment arrêter cela?

Steve B.
la source
Les versions récentes de logback sont beaucoup plus rapides pour calculer% L.
Thorbjørn Ravn Andersen
@ ThorbjørnRavnAndersen la documentation dit "L / ligne: La génération des informations de numéro de ligne n'est pas particulièrement rapide. Ainsi, son utilisation doit être évitée à moins que la vitesse d'exécution ne soit pas un problème." FWIW: logback.qos.ch/manual/layouts.html (donc peut-être que c'est plus rapide mais toujours pas super rapide ou quelque chose du
genre
@rogerdpack oui. Il est trouvé en analysant une trace de pile d'une exception. Cela est devenu plus rapide.
Thorbjørn Ravn Andersen

Réponses:

249

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

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

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

<configuration>
  <statusListener class="ch.qos.logback.core.status.NopStatusListener" />
  <!-- etc -->
</configuration>
Rasmus Faber
la source
9
C'est la bonne réponse, elle devrait être davantage votée, merci. (logback 1.0.11)
Jakub Kulhan
3
Cela a fonctionné. Je n'étais pas tout à fait clair que les INFOmessages du journal disparaîtraient également, mais en fait, ils le font. Je sais que la réponse le dit, mais pour une raison quelconque, ce n'était pas clair pour moi. Pour être si clair: corrigez le problème d'encodeur / disposition et non seulement les messages d'avertissement disparaîtront, mais les messages d'information disparaîtront également, même s'ils ne sont pas liés au problème.
Jason
3
N'a pas fonctionné avec l'attribut de débogage, mais a fonctionné parfaitement avec l'écouteur d'état.
Ameba Spugnosa
Merci - écouteur de statut nécessaire.
Ezekiel Victor
2
Attention en utilisant cette approche, cela semble fonctionner mais cela cache le fait que vous avez une erreur de configuration dans votre fichier. Le vrai problème est les journaux WARN, ces problèmes devraient être corrigés dans la configuration, puis tous les journaux inc. INFO disparaît.
teknopaul
45

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

Suivez http://logback.qos.ch/codes.html#layoutInsteadOfEncoder c'est à dire le lien mentionné par logback dans son message d'avertissement. Une fois que vous avez suivi les étapes qui y sont mentionnées, c'est-à-dire que si vous remplacez l'élément <layout> par <encoder>, la journalisation arrêtera d'imprimer les messages sur la console.

Ceki
la source
4
En quelque sorte, bien que vous m'ayez orienté dans la bonne direction. J'avais changé la syntaxe de cet encodeur sans effet, bien qu'il s'avère que la suppression d'une autre ligne dans le logback.xml qui provoquait un avertissement a fait l'affaire. Le truc trompeur à ce sujet est que la sortie semble afficher les décisions prises avant d'analyser réellement votre fichier de connexion, (1> Impossible de trouver la ressource [logback.groovy], 2> Ressource trouvée [logback-test.xml]). Il est assez déroutant de trouver un correctif dans le test de connexion pour masquer les messages d'état pour ce qui se passe avant qu'il ne soit analysé. Mais merci pour le pointeur.
Steve B.
5
Je pense que ce que voulait dire Steve B., c'est qu'il est contre-intuitif (ou du moins non conventionnel) que Logback supprime tous les messages d'état, y compris (et en particulier) ceux qui précèdent le chargement du fichier de configuration, à moins qu'il ne rencontre une erreur plus tard dans la configuration. Lorsque vous n'êtes pas familier avec cette règle et que vous voyez d'abord ces messages d'état (qui impliquent un avertissement ou une erreur de configuration), la plupart des utilisateurs s'attendent à ce qu'une fois l'erreur résolue, Logback n'imprime plus les messages d'erreur associés, mais continue à imprimer l'autre. messages d'état.
Derek Mahar
6
FWIW, je trouve également ce comportement assez déroutant. Le crachat de messages de niveau INFO fait un assez bon travail pour cacher les messages d'ERREUR en me disant ce que j'ai réellement besoin de réparer. L'absence de DTD, ou de toute autre spécification de la syntaxe du fichier de configuration, en a fait un véritable essai de débogage même une fois que j'ai repéré le message.
Tom Anderson
4
@Ceki: J'ai finalement compris: la deuxième façon de déclencher ces messages est d'avoir l' debug="true"attribut dans l' configurationélément de logback.xml. Veuillez le mentionner pour le bénéfice des autres personnes qui tombent dans ce trou!
Carl Smotricz
6
Peut-être avant la première instruction INFO, il devrait y avoir un 'Avertissement détecté, affichant toutes les informations d'état passées. Pour arrêter ce message, corrigez vos avertissements / erreurs '
David Roussel
7

La réponse de Ceki est correcte:

(...) si des avertissements ou des erreurs surviennent pendant l'analyse du fichier de configuration, logback imprimera automatiquement les données d'état sur la console.

Une fois que vous avez bien fait les choses, 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 <encoder>sous-composant - <layout>est maintenant obsolète et si vous l'utilisez, des messages d'erreur apparaîtront. Vous ne pouvez pas contrôler cela, c'est le comportement par défaut de 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 sur les codes d'erreurs , qui a la bonne façon de configurer l'enregistreur. Cela a résolu 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>
Cbaldan
la source
4

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

Remplacez les éléments "<layout>" par "<encoder> .. </encoder>"

Le coupable est: <layout class = "ch.qos.logback.classic.PatternLayout">

Intesar Mohammed
la source
1
Si vous souhaitez supprimer complètement ces messages, utilisez le NopStatusListener comme décrit par Rasmus. L'approche encodeur vs layout ne supprime pas les messages tels que «logback.groovy not found» par exemple. J'utilise logback-classic 1.1.3 (mars 2015)
Cristian Botiza
3

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

<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 s'exécute avec l'entrée suivante dans le pom.xml

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

Cela semble être corrigé dans la version 0.9.29. Je viens de faire plusieurs tests. Plus d'INFO Joran. Je suppose que c'est la fixation engage.

Michael-O
la source
2

J'ai eu le même problème j'ai ajouté cette ligne

        <!-- Stop output INFO at start -->
        <statusListener class="ch.qos.logback.core.status.NopStatusListener" />

dans le logback et cela a fonctionné avec succès

Zineb Hachmaoui
la source
Cela fonctionne, mais cela empêche également la sortie des messages d'ERREUR - aucune sortie n'est produite lorsqu'un problème sérieux de configuration de connexion se produit.
Honza
0

J'ai tout essayé et rien n'a fonctionné pour moi. Mon problème était dû à plusieurs fichiers logback.xml dans mon chemin de classe. C'est le cas courant 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.

Filip
la source
quel résultat vous a-t-il donné?
rogerdpack
0

En utilisant le logback.groovy:statusListener(NopStatusListener) (dans lesrc/test/resources/logback.groovy ) fonctionne.

(Un cas d'utilisation valide est, par exemple, si vous travaillez avec ANT dans Eclipse, en utilisant la journalisation de retour, les classes groovy et les 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 (si le chemin de classe d'ANT est dit utiliser le chemin de classe des projets).)

Andreas Dietrich
la source
0

Je préfère utiliser l’écouteur de statut pour désactiver mes propres journaux de connexion:

<configuration>
  <statusListener class="ch.qos.logback.core.status.NopStatusListener" />
  ...
</configuration>

Mais comme cela a été mentionné, NopStatusListener empêche également d'afficher les avertissements et les erreurs. Vous pouvez donc écrire votre écouteur de statut personnalisé et modifier manuellement le niveau de journalisation:

package com.your.package;

import ch.qos.logback.core.status.OnConsoleStatusListener;
import ch.qos.logback.core.status.Status;

import java.util.List;

public class PrintOnlyWarningLogbackStatusListener extends OnConsoleStatusListener {

    private static final int LOG_LEVEL = Status.WARN;

    @Override
    public void addStatusEvent(Status status) {
        if (status.getLevel() == LOG_LEVEL) {
            super.addStatusEvent(status);
        }
    }

    @Override
    public void start() {
        final List<Status> statuses = context.getStatusManager().getCopyOfStatusList();
        for (Status status : statuses) {
            if (status.getLevel() == LOG_LEVEL) {
                super.start();
            }
        }
    }

}    

Ensuite, utilisez-le dans votre fichier logback.xml:

<configuration>
  <statusListener class="com.your.package.PrintOnlyWarningLogbackStatusListener" />
  ...
</configuration>
Maksym Pecheniuk
la source