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


83

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をどのように使用しますか?システムの各部分が独自のロガーに書き込むか、すべてがデフォルトのロガーに書き込まれ、構成によって次に何をするかが決まりますか?

回答:


96

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

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

どこに完全qualifedタイプを使用して「という名前」されます上記のログに送信されたメッセージ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の記事です:


5
あなたもPatternLayoutはを使用してログのノイズ低減するクラスの名前空間の対数部分から除外することができlogging.apache.org/log4net/release/sdk/...の 意志「ロガー名に、例えば『ABC』パターン%ロガー{2} 「bc」を出力します。
AlfeG 2011

7
プライベート静的読み取り専用ILogログ= LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod()。DeclaringType);
キャスパーレオンニールセン

なぜ2番目のアプローチが最初のアプローチよりも優れているのですか?!クラス名は静的であり、変更した場合はロガーでも名前を更新する必要がありますが、クラス名を取得するためだけにリフレクション呼び出しを行う意味はありますか?
MeTitus 2016

1
@CasperLeonNielsenそれがどのように違うのか説明できますthis.GetType()か?
ErikE 2016年

2
@ErikE this.GetType()は、静的プロパティを定義するとき、静的クラス内、またはコンストラクターの外部では使用できません。
dhochee 2016

11

私の答えは遅れるかもしれませんが、それは初心者を助けることができると思います。以下のように変更しない限り、実行されたログは表示されません。

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


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

[ 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>

呼び出しクラスの内部:

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

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

これで、同じクラスのどこにいても通話ログを作成できます。以下は、操作中に呼び出すことができるメソッドの1つです。

log.Error("message");

ILogインスタンスメンバーを作成する必要はありませんよね?私はここで同じ質問をより詳細に尋ねましが、おそらく私はあなたの意見を得ることができますか?
ミントラン

5

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

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

このようにして、コピーして貼り付けるときにコードを変更することを忘れずに、log4netを使用するすべてのクラスで同じコード行を使用できます。または、ロギングクラスを作成し、他のすべてのクラスにロギングクラスを継承させることもできます。


0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.