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はどのように使用しますか?システムの各部分が独自のロガーに書き込むか、すべてがデフォルトのロガーに書き込まれ、構成が次に何をするかを決定しますか?
コード内でメッセージを記録する方法については、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と独自のコードに異なるログレベルを指定できる必要があります。
さらに読むために、ロギングについて書いたコードプロジェクトの記事を以下に示します。
私の答えは遅れているかもしれませんが、初心者には役立つと思います。以下のように変更を加えない限り、実行されたログは表示されません。
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");
呼び出しクラスに名前を付ける代わりに、次を使用し始めました。
private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
このようにして、log4netを使用するすべてのクラスで同じコード行を使用できます。コピーアンドペーストするときにコードを変更する必要はありません。あるいは、ロギングクラスを作成し、他のすべてのクラスにロギングクラスを継承させることもできます。
2番目のアプローチの欠点は、ロガーが作成される大きなリポジトリです。ルートが定義され、クラスロガーが定義されていない場合、このロガーは同じことを行います。実動システムの標準シナリオでは、クラスのグループ専用のロガーをほとんど使用していません。私の英語でごめんなさい。