86

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

4

4 に答える 4

99

コード内でメッセージをログに記録する方法に関して、私は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の記事です:

于 2011-08-17T07:48:39.327 に答える
13

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

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");
于 2016-12-31T07:01:42.540 に答える
7

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

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

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

于 2017-03-28T16:02:35.460 に答える
0

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

于 2017-05-09T08:23:06.627 に答える