Wie kann verhindert werden, dass die Rückmeldung zu Beginn jedes Protokolls ihren eigenen Status ausgibt?

145

Dies scheint ein Fehler in Bezug auf Nachlässigkeit zu sein, aber ich kann die Ursache nicht finden. Protokollierung mit logback / slf4j (neueste Version slf4j-api-1.6.1, logback core / classic 0.9.24). Die einfachste Protokollkonfiguration zum Testen ist:

<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>

Jedes Protokoll-Setup beginnt mit den internen Statuszeilen von 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]

Dies ist laut Dokument das Standard-Logback, das standardmäßig verwendet wird. Anschließend wird die Konfiguration (die für die Ausgabe eines anderen Formats eingerichtet ist) gelesen und die ordnungsgemäß formatierte Ausgabe fortgesetzt. Es gibt einen Konfigurationsparameter, <configuration debug="false">der dies nicht beeinflusst.

Weiß jemand, wie man das abschaltet?

Steve B.
quelle
Neuere Versionen von Logback können% L viel schneller berechnen.
Thorbjørn Ravn Andersen
@ ThorbjørnRavnAndersen In den Dokumenten heißt es: "L / line: Das Generieren der Zeilennummerninformationen ist nicht besonders schnell. Daher sollte die Verwendung vermieden werden, es sei denn, die Ausführungsgeschwindigkeit ist kein Problem." FWIW: logback.qos.ch/manual/layouts.html (also vielleicht schneller, aber immer noch nicht superschnell oder so ...)
Rogerdpack
@rogerdpack ja. Es wird durch Analysieren einer Stapelverfolgung einer Ausnahme gefunden. Das ist schneller geworden.
Thorbjørn Ravn Andersen

Antworten:

249

Wenn Sie das debugAttribut des configurationElements auf festlegen true, werden alle Statusinformationen an die Konsole gesendet. Wenn dies Ihr Problem ist, setzen Sie es einfach auf false oder entfernen Sie es.

Wenn Sie Konfigurationsprobleme der Stufe WARNoder höher haben, werden auch alle Statusinformationen an der Konsole protokolliert (einschließlich Meldungen der Stufe INFO). Die beste Lösung für dieses Problem besteht darin, das Problem zu beheben (in Ihrem Fall ersetzen Sie das <layout>Element durch ein <encoder>Element).

Wenn Sie das Problem aus irgendeinem Grund nicht beheben können, aber die Statusinformationen von der Konsole entfernen möchten, können Sie stattdessen eine Alternative konfigurieren StatusListener . Verwenden Sie die NopStatusListener, um die Statusinformationen vollständig zu entfernen:

<configuration>
  <statusListener class="ch.qos.logback.core.status.NopStatusListener" />
  <!-- etc -->
</configuration>
Rasmus Faber
quelle
9
Dies ist die richtige Antwort, es sollte mehr positiv bewertet werden, danke. (Logback 1.0.11)
Jakub Kulhan
3
Das hat funktioniert. Mir war nicht ganz klar, dass die INFOProtokollnachrichten auch verschwinden würden, aber tatsächlich. Ich weiß, dass die Antwort dies sagt, aber aus irgendeinem Grund war es mir nicht klar. Um ganz klar zu sein: Beheben Sie das Encoder- / Layout-Problem und die Warnmeldungen verschwinden nicht nur, sondern auch die Infomeldungen, auch wenn sie nicht mit dem Problem zusammenhängen.
Jason
3
Funktionierte nicht mit dem Debug-Attribut, aber einwandfrei mit dem Status-Listener.
Ameba Spugnosa
Danke - benötigter Status Listener.
Hesekiel Victor
2
Wenn Sie diesen Ansatz sorgfältig anwenden, scheint er zu funktionieren, verbirgt jedoch die Tatsache, dass Ihre Datei einen Konfigurationsfehler enthält. Das eigentliche Problem sind die WARN-Protokolle. Diese Probleme sollten in der Konfiguration behoben werden, dann alle Protokolle inkl. INFO gehen weg.
Teknopaul
45

Wie in den Dokumenten beschrieben , druckt Logback automatisch Statusdaten auf der Konsole, wenn beim Parsen der Konfigurationsdatei Warnungen oder Fehler auftreten.

Folgen Sie http://logback.qos.ch/codes.html#layoutInsteadOfEncoder, dh dem Link, der von logback in seiner Warnmeldung erwähnt wird. Sobald Sie die darin genannten Schritte ausgeführt haben, dh wenn Sie das <layout> -Element durch <encoder> ersetzen, wird bei der Rückmeldung das Drucken von Nachrichten auf der Konsole beendet.

Ceki
quelle
4
Irgendwie richtig, obwohl du mich in die richtige Richtung gelenkt hast. Ich hatte ohne Wirkung auf diese Encoder-Syntax umgestellt, obwohl sich herausstellte, dass das Entfernen einer anderen Zeile in der logback.xml, die eine Warnung verursachte, den Trick tat. Das Täuschende daran ist, dass die Ausgabe anscheinend Entscheidungen ausgibt, die getroffen wurden, bevor Ihre Logback-Datei tatsächlich analysiert wurde (1> Ressource [logback.groovy] konnte NICHT gefunden werden, 2> Ressource gefunden [logback-test.xml]). Es ist ziemlich verwirrend für eine Korrektur im Logback-Test, Statusmeldungen für das zu verbergen, was passiert, bevor es analysiert wird. Aber danke für den Hinweis.
Steve B.
5
Ich denke, Steve B. meinte damit, dass es nicht intuitiv (oder zumindest unkonventionell) ist, dass Logback alle Statusmeldungen unterdrückt , einschließlich (und insbesondere) derjenigen, die dem Laden der Konfigurationsdatei vorausgehen, es sei denn, es tritt später in der Konfiguration ein Fehler auf. Wenn Sie mit dieser Regel nicht vertraut sind und diese Statusmeldungen zum ersten Mal sehen (was eine Konfigurationswarnung oder einen Konfigurationsfehler impliziert), würden die meisten Benutzer erwarten, dass Logback nach Behebung des Fehlers die zugehörigen Fehlermeldungen nicht mehr druckt, sondern die anderen weiterhin druckt Statusmeldungen.
Derek Mahar
6
FWIW, ich finde dieses Verhalten auch ziemlich verwirrend. Der Spuck von Nachrichten auf INFO-Ebene macht einen ziemlich guten Job darin, die FEHLER-Nachrichten zu verbergen, die mir sagen, was ich tatsächlich reparieren muss. Das Fehlen einer DTD oder einer anderen Spezifikation der Syntax der Konfigurationsdatei machte das Debuggen zu einem ziemlichen Versuch, selbst wenn ich die Nachricht entdeckte.
Tom Anderson
4
@Ceki: Ich habe es endlich herausgefunden: Die zweite Möglichkeit, diese Nachrichten auszulösen, besteht darin, das debug="true"Attribut im configurationElement von zu haben logback.xml. Bitte erwähnen Sie dies zum Nutzen anderer Menschen, die in dieses Loch fallen!
Carl Smotricz
6
Möglicherweise sollte vor der ersten INFO-Anweisung eine Warnung erkannt werden, die alle früheren Statusinformationen ausgibt. Um diese Meldung zu stoppen, beheben Sie Ihre Warnungen / Fehler '
David Roussel
7

Ceki Antwort ist richtig:

(...) Wenn beim Parsen der Konfigurationsdatei Warnungen oder Fehler auftreten, druckt Logback automatisch Statusdaten auf der Konsole.

Sobald Sie es richtig verstanden haben, wird es in den ersten Zeilen Ihres Protokolls keine Verschmutzung mehr geben.

Ab März 2015 müssen Sie in Logback 1.1.2 die <encoder>Unterkomponente verwenden. Diese<layout> ist jetzt veraltet. Wenn Sie sie verwenden, werden Fehlermeldungen angezeigt . Sie können dies nicht steuern. Dies ist das Standardverhalten von Logback .

Einige interne Klassen wurden ebenfalls umbenannt, und sogar die Beispiele auf ihrer Handbuchseite sind veraltet!

Hier ist das Code-Snippet von der Hilfeseite "Fehlercode" , auf der der Logger korrekt konfiguriert werden kann. Dies hat das Problem in meinem Projekt vollständig behoben. 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
quelle
4

Mir wurde klar, dass Steve das Update gefunden hatte, aber er erwähnte es nicht im Thread. Falls eine andere Person das gleiche Problem hat, ist dies die Lösung.

Ersetzen Sie "<layout>" - Elemente durch "<encoder> .. </ encoder>"

Der Schuldige ist: <layout class = "ch.qos.logback.classic.PatternLayout">

Intesar Mohammed
quelle
1
Wenn Sie diese Nachrichten vollständig entfernen möchten, verwenden Sie den NopStatusListener wie von Rasmus beschrieben. Der Encoder-vs-Layout-Ansatz unterdrückt keine Nachrichten wie beispielsweise "logback.groovy not found". Ich benutze Logback-Klassiker 1.1.3 (März 2015)
Cristian Botiza
3

Ich hatte selbst mit dem gleichen Problem zu kämpfen, dh es wurden gleich zu Beginn eine Reihe von Zeilen protokolliert, die nicht mit meinem Code zusammenhängen. Hier ist, wie ich es behoben habe.

<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" />

Dies wird mit dem folgenden Eintrag in der Datei pom.xml ausgeführt

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

Dies scheint in 0.9.29 behoben zu sein. Habe gerade mehrere Tests gemacht. Keine Joran INFO mehr. Ich denke, dies ist das Fixing-Commit.

Michael-O
quelle
2

Ich hatte das gleiche Problem, das ich dieser Zeile hinzugefügt habe

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

im Logback und es hat erfolgreich funktioniert

Zineb Hachmaoui
quelle
Dies funktioniert, verhindert jedoch auch die Ausgabe von FEHLERMELDUNGEN - es wird keine Ausgabe erzeugt, wenn ein ernstes Problem bei der Konfiguration der Rückmeldung auftritt.
Honza
0

Ich habe alles versucht und nichts hat bei mir funktioniert. Mein Problem war auf mehrere logback.xml-Dateien in meinem Klassenpfad zurückzuführen. Dies ist häufig bei multimodularen Projekten der Fall. Wenn sich nur eine logback.xml-Datei im Klassenpfad befindet, gibt es keine Mehrdeutigkeit und das Problem ist behoben.

Filip
quelle
Welchen Output hat es dir gegeben?
Rogerdpack
0

Die Verwendung von logback.groovy:statusListener(NopStatusListener) (in the src/test/resources/logback.groovy) funktioniert.

(Ein gültiger Anwendungsfall ist z. B. die Arbeit mit ANT in Eclipse, die Verwendung von Logback-Protokollierung, groovigen Klassen und Komponententests, bei denen die Komponententests durchgeführt werden src/test/resources/logback.groovy, aber auch die src/main/resources/logback.groovy(oder ähnliche), die Sie nicht ausschließen können (wenn der Klassenpfad von ANT verwendet werden soll) der Projektklassenpfad).)

Andreas Dietrich
quelle
0

Ich bevorzuge die Verwendung des Status-Listeners, um eigene Logback-Protokolle auszuschalten:

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

Wie bereits erwähnt, verhindert NopStatusListener jedoch auch das Anzeigen von Warnungen und Fehlern. So können Sie Ihren benutzerdefinierten Status-Listener schreiben und die Protokollstufe manuell ändern:

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();
            }
        }
    }

}    

Verwenden Sie es dann in Ihrer logback.xml-Datei:

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