web-dev-qa-db-ja.com

すべてのログの開始時にログバックが独自のステータスを出力しないようにする方法は?

これは不注意なエラーのように見えますが、原因を見つけることができないようです。 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">があります。

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

125
Steve B.

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

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

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

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

ドキュメントで説明 のように、構成ファイルの解析中に警告またはエラーが発生した場合、logbackはコンソールにステータスデータを自動的に出力します。

http://logback.qos.ch/codes.html#layoutInsteadOfEncoder に従ってください。つまり、logbackの警告メッセージに記載されているリンクです。ここに記載されている手順に従うと、つまり、<layout>要素を<encoder>に置き換えると、logbackはコンソールでのメッセージの出力を停止します。

45
Ceki

Ceki答えは正しい:

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

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

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

一部の内部クラスの名前も変更されており、マニュアルページの例も時代遅れです!

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

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

「<layout>」要素を「<encoder> .. </ encoder>」に置き換えます。これが原因です。<layout class = "ch.qos.logback.classic.PatternLayout">

4

これは0.9.29で修正されたようです。いくつかのテストを行ったところです。ジョラン情報はもうありません。 this が修正コミットだと思います。

2
Michael-O

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

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

_logback.groovy_:statusListener(NopStatusListener)を使用すると(_src/test/resources/logback.groovy_で)動作します。

(有効なユースケースは、EclipseでANTを使用し、ログバックロギング、groovyクラス、ユニットテストで_src/test/resources/logback.groovy_を使用するが、_src/main/resources/logback.groovy_(または同様の)除外できません(ANTのクラスパスがプロジェクトのクラスパスを使用すると言われている場合)。

0

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

0
Filip