web-dev-qa-db-ja.com

log4net(ロガーの命名)を使用する正しい方法

Log4netを構成および使用するには2つの方法があります。 1つ目は、独自のアペンダーと関連付けられたロガーを構成できる場合です。

<!-- language: xml -->

<appender name="myLogAppender" type="log4net.Appender.RollingFileAppender" >
    <file value="Logs\myLog.log" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %level - %message%n" />
    </layout>
</appender>

<logger name="myLog">
    <level value="All"></level>
    <appender-ref ref="myLogAppender" />
</logger>

そして、ログに何かを書きたいときは、次のことができます:

ILog log = LogManager.GetLogger("myLog");
log.Info("message");

それを使用する別の方法は、ルートを必要なだけ詳細に設定することです:

<!-- language: xml -->

<root>
    <level value="Error" />
    <appender-ref ref="myLogAppender" />
</root>

この場合、次のようなメッセージを記録できます。

ILog log = LogManager.GetLogger(typeof(Bar));
log.Info("message");

2番目の方法の利点は、一部のメッセージをオンザフライで有効または無効にできることです。しかし問題は、私がEPiServer CMSで開発しており、log4netを使用する独自のログシステムがあり、ルートレベルで情報ログを有効にすると、多くのシステムログが書き込まれることです。

Log4netはどのように使用しますか?システムの各部分が独自のロガーに書き込むか、すべてがデフォルトのロガーに書き込まれ、構成が次に何をするかを決定しますか?

79
Sly

コード内でメッセージを記録する方法については、2番目のアプローチを選択します。

ILog log = LogManager.GetLogger(typeof(Bar));
log.Info("message");

上記のログに送信されたメッセージには、完全修飾型Barを使用して「名前」が付けられます。

MyNamespace.Foo.Bar [INFO] message

このアプローチの利点は、ログを整理するための事実上の標準であり、名前空間でログメッセージをフィルタリングできることです。たとえば、INFOレベルのメッセージを記録するように指定できますが、BarのロギングレベルをDEBUGに上げることができます。

<log4net>
    <!-- appenders go here -->
    <root>
        <level value="INFO" />
        <appender-ref ref="myLogAppender" />
    </root>

    <logger name="MyNamespace.Foo.Bar">
        <level value="DEBUG" />
    </logger>
</log4net>

名前を介してログをフィルタリングする機能は、log4netの強力な機能です。すべてのメッセージを"myLog"に記録するだけで、この力の多くを失います。

EPiServer CMSに関しては、上記のアプローチを使用して、CMSと独自のコードに異なるログレベルを指定できる必要があります。

さらに読むために、ロギングについて書いたコードプロジェクトの記事を以下に示します。

94
ColinE

私の答えは遅れているかもしれませんが、初心者には役立つと思います。以下のように変更を加えない限り、実行されたログは表示されません。

2 Log4netを実装する場合、ファイルは変更する必要があります。


  1. プロジェクトにlog4net.dllの参照を追加します。
  2. app.config
  3. Classログを実装するファイル。

Inside [app.config]:

まず、「configSections」の下で、以下のコードを追加する必要があります。

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />

次に、「構成」ブロックの下に、以下のコードを記述する必要があります(このコードは、必要に応じてカスタマイズされていますが、魅力のように機能します)。

<log4net debug="true">
    <logger name="log">
      <level value="All"></level>
      <appender-ref ref="RollingLogFileAppender" />
    </logger>

    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="log.txt" />
      <appendToFile value="true" />
      <rollingStyle value="Composite" />
      <maxSizeRollBackups value="1" />
      <maximumFileSize value="1MB" />
      <staticLogFileName value="true" />

      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %C.%M [%line] %-5level - %message %newline %exception %newline" />
      </layout>
    </appender>
</log4net>

InsideCalling Class

このlog4netを使用するクラス内で、以下のコードを宣言する必要があります。

 ILog log = LogManager.GetLogger("log");

これで、同じクラスのどこでも好きな場所でログを呼び出す準備ができました。以下は、操作中に呼び出すことができるメソッドの1つです。

log.Error("message");
9
Ankur Soni

呼び出しクラスに名前を付ける代わりに、次を使用し始めました。

private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

このようにして、log4netを使用するすべてのクラスで同じコード行を使用できます。コピーアンドペーストするときにコードを変更する必要はありません。あるいは、ロギングクラスを作成し、他のすべてのクラスにロギングクラスを継承させることもできます。

4
Agent RhoShambo

2番目のアプローチの欠点は、ロガーが作成される大きなリポジトリです。ルートが定義され、クラスロガーが定義されていない場合、このロガーは同じことを行います。実動システムの標準シナリオでは、クラスのグループ専用のロガーをほとんど使用していません。私の英語でごめんなさい。

0
user1785960