log4net階層とログレベル


127

このサイトは言う

ロガーにはレベルを割り当てることができます。レベルは、log4net.Core.Levelクラスのインスタンスです。次のレベルは、優先度の高い順に定義されています

  • すべて
  • デバッグ
  • INFO
  • 警告
  • エラー
  • 致命的
  • オフ

DEBUGの優先度は最も低く、ERRORの方が高くなっています。

質問

  • 私が最小と最大の例のデバッグとエラーを設定すると、デバッグ、情報、警告、エラーのすべてが出力されます。最小および最大フィルターを使用しません。ERROR(ログレベル= ERROR)を指定した場合、デバッグ、情報、警告が含まれますか
 <filter type="log4net.Filter.LevelRangeFilter">
     <param name="LevelMin" value="ERROR"/>
     <param name="LevelMax" value="ERROR"/>
 </filter>

最小および最大フィルターの代わり。レベルを構成し、その下に他のすべてのレベルを含めてログに記録することは可能ですか?

例-レベルをエラーとして設定します。これには、デバッグ、情報、警告、エラーが含まれます。これはlog4netで可能ですか?

コメントの1つに基づくlog4net構成の投稿:

     <?xml version="1.0" encoding="utf-8" ?>
     <configuration>
        <configSections>
            <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
        </configSections >
        <log4net debug="true">
  <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
        <layout type="log4net.Layout.XMLLayout" /> -->
        <param name="File" value="TestLog.log" />
        <param name="AppendToFile" value="false" />
        <layout type="log4net.Layout.PatternLayout">
            <header type="log4net.Util.PatternString" value="[START LOG] %newline" />
            <footer type="log4net.Util.PatternString" value="[END LOG] %newline" />
            <conversionPattern value="%d [%t] %-5p - %m%n" />
        </layout>
        <filter type="log4net.Filter.LevelRangeFilter">
            <param name="LevelMin" value="DEBUG"/>
            <param name="LevelMax" value="ERROR"/>
        </filter>
    </appender>
<root>
        <level value="ALL" />
        <appender-ref ref="LogFileAppender" />
    </root>
    <logger name="log4NetExample">
        <!-- <appender-ref ref="B" /> -->
        <level value="ALL" />
        <appender-ref ref="LogFileAppender" />
    </logger>
</log4net>


ログレベルをINFOに設定して、INFOとDEBUGが含まれているかどうかを確認しましたか?
デフォルト

5
DEBUGの優先度が最も低く、エラーが最も高いようです。これは優先度ではなく、メッセージ以上のしきい値がログに記録されます。
R. Schreurs 2013

あなただけを使ってみましたlevelMaxか?私はあなたが指定していない場合には、その下のすべてのものを含めるべきだと思うlevelMin
AN

回答:


90

これは、ロガーにレベルを割り当てることができるレベルで何が記録されるかを理解するのに役立ちます。レベルは、log4net.Core.Levelクラスのインスタンスです。次のレベルは、重要度の高い順に定義されています-ログレベル。

各設定レベルで記録されたレベルの数:

 ALL    DEBUG   INFO    WARN    ERROR   FATAL   OFF
All                        
DEBUG  DEBUG                  
INFO   INFO   INFO               
WARN   WARN   WARN   WARN           
ERROR  ERROR  ERROR  ERROR  ERROR      
FATAL  FATAL  FATAL  FATAL  FATAL  FATAL  
OFF    OFF    OFF    OFF    OFF    OFF    OFF

2
申し訳ありませんが、これはwswgだと思いましたが、どうしてですか?
Mel Pama 2016年

1
あなたは見てとることができ、サイトのこの部分を回答の適切な形式
Jarodモーザー

36

ほとんどのアプリケーションでは、最大レベルではなく最小レベルを設定します。

たとえば、コードをデバッグするときは、最小レベルをDEBUGに設定し、本番環境ではそれをWARNに設定します。


私の更新された質問をチェックしてください、私の質問はレベルとログステートメントです
Siva

に変更<level value="ALL" /> する<level value="WARN" />と、警告とエラーのみが表示されます。
Ilya Kogan

2
いいえ、それは役に立ちません。変えてみました。以下の優先度のログは含まれていません
Siva

12
もちろん、優先度以下のログは表示されません。これは、設定する最低優先度です。
Ilya Kogan 2012年

19

DEBUGはすべてのメッセージを表示し、INFOはDEBUGメッセージ以外のすべてを表示します。
通常、INFOまたはWARNを使用します。これは会社の方針に依存します。


私の更新された質問を確認してください。私の質問はレベルとログステートメントです
Siva

log4Net設定全体を投稿してください。干渉しているロガーが2つある可能性があります。
weismat '19年

そして個人的にはこれまでレベル設定のみを使ってきました。可能であれば、最小/最大の設定は避けるべきだと思います。
weismat 2012年

log4netの設定全体を投稿しました。チェックしてください。私は学び、実行しようとしています。
Siva

16

以下は、すべてのlog4netレベルの優先度を示すコードです。

TraceLevel(Level.All); //-2147483648

TraceLevel(Level.Verbose);   //  10 000
TraceLevel(Level.Finest);    //  10 000
    
TraceLevel(Level.Trace);     //  20 000
TraceLevel(Level.Finer);     //  20 000
    
TraceLevel(Level.Debug);     //  30 000
TraceLevel(Level.Fine);      //  30 000
    
TraceLevel(Level.Info);      //  40 000
TraceLevel(Level.Notice);    //  50 000
    
TraceLevel(Level.Warn);      //  60 000
TraceLevel(Level.Error);     //  70 000
TraceLevel(Level.Severe);    //  80 000
TraceLevel(Level.Critical);  //  90 000
TraceLevel(Level.Alert);     // 100 000
TraceLevel(Level.Fatal);     // 110 000
TraceLevel(Level.Emergency); // 120 000
    
TraceLevel(Level.Off); //2147483647


private static void TraceLevel(log4net.Core.Level level)
{
   Debug.WriteLine("{0} = {1}", level, level.Value);
}


10

他の人が指摘したように、通常、そのレベルとそれよりも重大なレベルを記録するために、最小のログレベルを指定することが推奨されます。ロギングレベルをさかのぼって考えているようです。

ただし、個々のレベルのログをより詳細に制御したい場合は、次の構文を使用して、1つ以上の特定のレベルのみをログに記録するようにlog4netに指示できます。

<filter type="log4net.Filter.LevelMatchFilter">
  <levelToMatch value="WARN"/>
</filter>

または、「拒否」ノードをフィルターに追加して、特定のロギングレベルを除外します。

複数のフィルターを積み重ねて、複数のレベルを指定できます。たとえば、WARNレベルとFATALレベルのみが必要な場合などです。必要なレベルが連続している場合は、LevelRangeFilterがより適切です。

参照ドキュメント:log4net.Filter.LevelMatchFilter

他の回答で十分な情報が得られない場合は、log4netから必要な情報を得るのに役立つことを願っています。


ああ、拒否は私が個人的に探していたものです。info + errorメッセージが必要ですが、デバッグはできません。これをありがとう。
Sarfaraaz 2017年

by adding a "deny" node to the filterどうやって?
mrhotroad

@mrhotroad log4netの現在のバージョンと2014年のバージョンとの違いはわかりませんが、LevelMatchFilter.AcceptOnMatchのドキュメントは次のとおりです。logging.apache.org/log4net/release/sdk/html/…したがって、次のことができます<levelToMatch value = "WARN" AcceptOnMatch = "false" />
ulty4life

8

その真の公式ドキュメント(Apache log4net™マニュアル-はじめに)には、次のレベルがあると記載されています...

  • すべて
  • デバッグ
  • INFO
  • 警告
  • エラー
  • 致命的
  • オフ

...しかし、奇妙なことに、アセンブリlog4net.dll、v1.2.15.0の封印されたクラスlog4net.Core.Levelを表示すると、次のレベルが定義されているのがわかります...

public static readonly Level Alert;
public static readonly Level All;
public static readonly Level Critical;
public static readonly Level Debug;
public static readonly Level Emergency;
public static readonly Level Error;
public static readonly Level Fatal;
public static readonly Level Fine;
public static readonly Level Finer;
public static readonly Level Finest;
public static readonly Level Info;
public static readonly Level Log4Net_Debug;
public static readonly Level Notice;
public static readonly Level Off;
public static readonly Level Severe;
public static readonly Level Trace;
public static readonly Level Verbose;
public static readonly Level Warn;

TRACEをPostSharpのOnBoundaryEntryおよびOnBoundaryExitと組み合わせて長い間使用しています。これらの他のレベルがドキュメントにない理由は何ですか。さらに、これらすべてのレベルの真の優先順位は何ですか?


2
それは価値があるので、それらはすべて次のリンクにリストされていますが、彼らはマニュアルをしばらく更新していないようです。logging.apache.org/log4net/release/sdk/html/...
Dinerdo

2
レベルファイン; レベルより細かい; 最高級のレベル; これからはこの3つを使います。
maembe

-3

このようにしてみてください、それは私のために働いた

<root>
  <!--<level value="ALL" />-->
  <level value="ERROR" />
  <level value="INFO" />
  <level value="WARN" />     
</root>

これは、エラー、情報、警告の3種類のエラーを記録します。


7
ルートロガーのlog4netドキュメントによると、「レベル:オプションの要素、最大1つまで許可されます。このロガーのログレベルを定義します。このロガーは、このレベル以上のイベントのみを受け入れます。
生殖腺

なぜこの回答は反対票を投じたのですか?それも私のために働いています。したがって、投票します。
amilamad

1
<level value = "WARN" />で十分だったからです。
rlesias
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.