1. ホーム
  2. c#

[解決済み] log4netの正しい使い方(ロガーネーミング編)

2023-05-14 07:53:09

質問

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");

もう一つの使い方は、rootを好きなだけ細かく設定することです。

<!-- 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はどのように使うのですか?システムの各部分は、それ自身のロガーに書き込みます。または、すべてがデフォルトのロガーに書き込まれ、設定が次に何をするかを決定しますか?

どのように解決するのですか?

コード内のメッセージをどのように記録するかについては、私は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とあなた自身のコードに異なるログレベルを指定するために、上記のアプローチを使用することができるはずです。

さらに読むために、ロギングについて私が書いたcodeprojectの記事があります。