すべてのログの開始時にlogbackが独自のステータスを出力しないようにするにはどうすればよいですか?


145

これは不注意なエラーのようですが、原因がわかりません。logback / slf4jによるロギング(最新バージョンslf4j-api-1.6.1、logback core / classic 0.9.24)。テストのための最も単純なログ構成は次のとおりです。

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

すべてのログ設定は、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]

これは、ドキュメントによれば、logbackがデフォルトで使用する形式です。次に、(別のフォーマットを出力するように設定されている)構成の読み取りを終了し、適切にフォーマットされた出力を続行します。これに<configuration debug="false">影響しない設定パラメーターがあります。

誰でもこれを止める方法を知っていますか?


Logbackの最近のバージョンでは、%Lの計算がはるかに高速です。
するThorbjörnRavnアンデルセン

@ThorbjørnRavnAndersenのドキュメントによると、「L /行:行番号情報の生成は特に高速ではありません。実行速度が問題にならない限り、その使用は避けてください。」FWIW:logback.qos.ch/manual/layouts.html(高速かもしれませんが、それでも超高速ではないかもしれません...)
rogerdpack

@rogerdpackはい。例外のスタックトレースを分析することによって検出されます。それは速くなった。
するThorbjörnRavnアンデルセン

回答:


249

要素のdebug属性をに設定すると、すべてのステータス情報がコンソールに表示されます。これが問題である場合は、falseに設定するか削除してください。configurationtrue

レベルWARN以上の構成の問題がある場合は、すべてのステータス情報(レベルのメッセージを含むINFO)がコンソールに記録されます。この問題の最善の解決策は、問題を修正することです(この場合、<layout>要素を要素に置き換えます<encoder>)。

何らかの理由で問題を解決できないが、ステータス情報をコンソールから削除したい場合は、代わりにを設定できますStatusListener。を使用しNopStatusListenerて、ステータス情報を完全に削除します。

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

9
これは正解です、もっと賛成すべきです、ありがとう。(logback 1.0.11)
Jakub Kulhan 14

3
これはうまくいきました。INFOログメッセージが消えることも完全にはわかりませんでしたが、実際には消えます。私は答えがこれを言っていることを知っていますが、何らかの理由でそれは私には分かりませんでした。明確にするために:エンコーダー/レイアウトの問題を修正すると、警告メッセージが消えるだけでなく、情報メッセージも消えます。問題とは無関係ですが。
Jason

3
debug属性では機能しませんでしたが、ステータスリスナーでは問題なく機能しました。
Ameba Spugnosa 2016年

ありがとう-ステータスリスナーが必要です。
エゼキエルビクター

2
このアプローチを注意深く使用すると、動作するように見えますが、ファイルに構成エラーがあるという事実は見えません。実際の問題はWARNログです。これらの問題は構成で修正する必要があり、その後すべてのログが修正されます。INFOは消えます。
teknopaul 2017年

45

ドキュメントに記載された警告またはエラーが設定ファイルの解析中に発生した場合、logback自動的コンソールのステータスデータを出力します。

フォローhttp://logback.qos.ch/codes.html#layoutInsteadOfEncoderすなわちその警告メッセージにlogback言及リンクを。ここで説明されている手順を実行すると、つまり、<layout>要素を<encoder>に置き換えると、logbackはコンソールにメッセージを出力しなくなります。


4
正解ですが、あなたは私を正しい方向に向けていました。警告を引き起こしていたlogback.xml内の別の行を削除するとうまくいくことが判明しましたが、私はそのエンコーダー構文に影響を与えずに変更しました。それについての欺瞞的なことは、出力が実際にログバックファイルを解析する前に行われた決定を出力しているように見えることです(1>リソース[logback.groovy]が見つかりませんでした、2>見つかったリソース[logback-test.xml])。解析される前に何が起こるかについてステータスメッセージを非表示にすることは、logback-testの修正でかなり混乱します。しかし、ポインタをありがとう。
スティーブB.

5
Steve B.が意味したのは、Logbackが(特に)構成ファイルのロードの前にあるメッセージを含め、すべてのステータスメッセージを抑制することは直感に反する(または通常とは異なる)ことであり、後で構成でエラーが発生しない限りです。このルールに慣れておらず、最初にこれらのステータスメッセージ(構成の警告またはエラーを意味する)が表示される場合、ほとんどのユーザーは、エラーが解決されると、Logbackは関連するエラーメッセージを出力しなくなりますが、他のメッセージは引き続き出力しますステータスメッセージ。
Derek Mahar

6
FWIW、私もこれは非常に混乱する動作を見つけます。INFOレベルのメッセージが大量にあるので、実際に修正する必要があることを示すERRORメッセージを非表示にできます。DTDの欠如、または構成ファイルの構文の他の仕様により、メッセージを見つけた後でもデバッグするのは非常に困難でした。
トムアンダーソン、

4
@Ceki:私はついにそれを理解しました:これらのメッセージをトリガーする2番目の方法debug="true"は、のconfiguration要素に属性を含めることですlogback.xml。この穴に落ちる他の人々の利益のためにこれを言及してください!
Carl Smotricz、2011年

6
おそらく、最初のINFOステートメントの前に、「警告が検出され、過去のすべてのステータス情報が出力されているはずです。このメッセージを停止するには、あなたの警告/エラー修正
デヴィッド・ルーセル

7

チェキの答えは正しいです:

(...)構成ファイルの解析中に警告またはエラーが発生した場合、logbackは自動的にステータスデータをコンソールに出力します。

正しく設定すると、ログの最初の行に汚染はなくなります。

2015年3月の時点で、Logback 1.1.2では、<encoder>サブコンポーネントを使用する必要<layout>があります。これは非推奨になりました。使用すると、エラーメッセージが表示されます。これを制御することはできません。これはLogbackのデフォルトの動作です。

一部の内部クラスも名前が変更されており、それらのマニュアルページの例でさえ古くなっています!

以下は、エラーコードのヘルプページのコードスニペットで、ロガーを設定する正しい方法があります。これは私のプロジェクトで問題を完全に修正しました。 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>

4

スティーブが修正を見つけたのに気付いたが、彼はスレッドでそれを述べなかった。他の人が同じ問題に遭遇した場合、ここで修正されます。

「<layout>」要素を「<encoder> .. </ encoder>」に置き換えます

犯人は次のとおりです: <layout class = "ch.qos.logback.classic.PatternLayout">


1
これらのメッセージを完全に削除する場合は、Rasmusの説明に従ってNopStatusListenerを使用してください。エンコーダーとレイアウトのアプローチは、たとえば「logback.groovy not found」などのメッセージを抑制しません。私はlogback-classic 1.1.3(2015年3月)を使用しています
Cristian Botiza

3

私自身も同じ問題に悩まされていました。つまり、最初に、コードに関係のない行がたくさん記録されていました。修正方法は次のとおりです。

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

これは、pom.xmlの次のエントリで実行されています

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

2

これは0.9.29で修正されたようです。いくつかのテストを行いました。Joran INFOはもうありません。これは修正コミットだと思います。


2

私はこの行を追加したのと同じ問題がありました

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

ログバックでそれはうまくいきました


これは機能しますが、ERRORメッセージの出力も防止されます-重大なログバック構成の問題が発生しても出力は生成されません。
Honza

0

私はすべてを試しましたが、何もうまくいきませんでした。私の問題は、クラスパスにある複数のlogback.xmlファイルが原因でした。これは、マルチモジュールプロジェクトの一般的なケースです。クラスパスにlogback.xmlファイルが1つしかない場合でも、あいまいさはなく、問題は解決されます。


どのような出力が得られましたか?
rogerdpack

0

logback.groovystatusListener(NopStatusListener)を使用すると(内でsrc/test/resources/logback.groovy)機能します。

(有効なユースケースは、例えば、EclipseでANTを使用し、ログバックロギング、groovyクラス、ユニットテストを使用するユニットテストを使用している場合に、ユニットテストがを取得しますが、除外できない(または類似の)ものsrc/test/resources/logback.groovyも表示されsrc/main/resources/logback.groovyます(ANTのクラスパスが使用すると言われている場合)プロジェクトのクラスパス)。


0

自分のログバックログをオフにするために、ステータスリスナーを使用することを好みます。

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

ただし、前述のように、NopStatusListenerは警告とエラーの表示も防止します。したがって、カスタムステータスリスナーを記述して、そのログレベルを手動で変更できます。

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

}    

次に、それをlogback.xmlファイルで使用します。

<configuration>
  <statusListener class="com.your.package.PrintOnlyWarningLogbackStatusListener" />
  ...
</configuration>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.