2013-09-16 4 views
35

私はうれしくSLF4Jをログバックして使用しています。2台のアペンダーROOTロガーです。ログバックで2種類のROOTロガーを作成するには?

<root level="DEBUG"> 
    <appender-ref ref="STDOUT" /> 
    <appender-ref ref="FILE" /> 
</root> 

はどのように我々は両方のアペンダのための別のログ・レベルを持っているだろうか?私はまだ全てのROOT-loggerメッセージが必要です。 FILE

出力の一部であることをすべてのログのニーズのためのSTDOUT

  • INFOレベルのための

    • DEBUGレベルの(したがってルートロガーが必要です)。

      すべてのサポートに感謝します。ありがとう。

  • 答えて

    44

    あなたは複数のルートロガーを持つことはありませんので、あなたの質問は少し誤解を招くことがあります。あなたが探しているのは、どのアペンダーがどのイベントを記録するかを細かく調整する方法です。

    そして、そのために、あなたがアペンダのそれぞれにThresholdFilterを追加:STDOUTためのFILE-アペンダとDEBUGため

    http://logback.qos.ch/manual/filters.html#thresholdFilter

    <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
        <level>INFO</level> 
    </filter> 
    

    設定レベルINFO。

    編集:私は、これが間違っているという別の答えの問題に異議を唱えなければなりません:はい、構成内に複数のルート要素を持つことができます。それは質問のタイトルが要求するものであったが、複数のルートを作成するものではない。ロガー。また、logbackマニュアル状態http://logback.qos.ch/manual/configuration.html#syntax(強調鉱山)下:

    それにもかかわらず、コンフィギュレーション・ファイルの非常に基本的な構造は ゼロ以上 <アペンダ>要素続い<構成>要素として記述することができます続いてゼロ以上の< logger>要素、 、それに続いて、最大で < root>要素が続きます。

    これはうまくいくかもしれませんが、少なくとも規約に反します。

    +0

    私は= '<ロガー名= "ch.qos" レベルを持っています"OFF" /> 'それでも設定されている両方のアペンダーにログインしていますが、どうすれば可能ですか? – piechuckerr

    +0

    誰もがそれほど情報を知らずにお手伝いできるかどうかは疑問です。あなたが解決する問題がある場合は、新しい質問を開いてください、コメントはこれのための場所ではありません。 – sheltem

    +0

    動作しているように見えますが、ドキュメントだけでなく、コードにも1つのルートロガーのみがサポートされているので、ルートロガーの機能の一部が見当たらないと思われます。例えば。 2つのルートロガーを宣言し、1つが異なるレベルを持つ場合、それはデフォルトレベルですか? [ソースコード](https://github.com/qos-ch/logback/blob/master/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java)がどのようにコンストラクタ内の_single_ rootロガーを初期化します。 – Rhubarb

    6

    前の回答は間違っです:あなたは、複数のroot要素、関連するログlevelappender-ref(私はlogbackで働いているとのそれぞれを持つことができます。バージョン>1.0.13)そのように、あなたも、あなたのアペンダ内のフィルタを配置する必要があります。この場合 :

    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> 
        <resetJUL>true</resetJUL> 
    </contextListener> 
    
    <!-- To enable JMX Management --> 
    <jmxConfigurator/> 
    
    <appender name="console-info" class="ch.qos.logback.core.ConsoleAppender"> 
        <filter class="ch.qos.logback.classic.filter.LevelFilter"> 
        <level>INFO</level> 
        <onMatch>ACCEPT</onMatch> 
        <onMismatch>DENY</onMismatch> 
        </filter> 
        <encoder> 
         <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern> 
        </encoder> 
    </appender> 
    
    <appender name="console-debug" class="ch.qos.logback.core.ConsoleAppender"> 
        <filter class="ch.qos.logback.classic.filter.LevelFilter"> 
        <level>DEBUG</level> 
        <onMatch>ACCEPT</onMatch> 
        <onMismatch>DENY</onMismatch> 
        </filter> 
        <encoder> 
         <pattern>[%d{ddMMMyyyy HH:mm:ss.SS}]%-5level %logger{45} - %msg %n</pattern> 
        </encoder> 
    </appender> 
    
    
    <root level="info"> 
        <appender-ref ref="console-info"/> 
    </root> 
    <root level="debug"> 
        <appender-ref ref="console-debug"/> 
    </root> 
    

    +7

    これはドキュメントとは異なります:http://logback.qos.ch/manual/configuration。 html#syntax .. "最大で1つ要素" –

    +1

    あなたの設定は誤解を招きます。あなたの 'console-debug'はログだけを記録し、' debug'レベル( 'warn'など)ではなく' console-info'は 'info'レベルだけを記録します。 –

    +0

    ダブルルート定義では、アペンダーは累積しますか?手動の "info"、 "warn"& "error"レベルのメッセージが両方のログに入ると思います(アペンダーにフィルターが設定されていないと仮定します)。私は正しい? –

    関連する問題