23

現在、log4net を使用してアプリケーションに複数のログ ファイルがあります。

あらゆる種類のメッセージを含む最上位のログ ファイルがあります。エラー情報のみを含むエラー ログ ファイルもあります。特定の例外の詳細とスタック トレースがエラー ログ ファイルにのみ表示されるように構成しようとしています。

私が使用している呼び出しはLog.Error(myMessage, myException);

私の設定は以下に見ることができます:

<configuration>
  <log4net>

    <root>
     <level value="ALL"/>
     <appender-ref ref="GeneralTextLog"/>
     <appender-ref ref="ErrorTextLog"/>
    </root>

<!-- The general appender rolls by date -->
<appender name="GeneralTextLog" type="log4net.Appender.RollingFileAppender">
  <filter type="log4net.Filter.LevelRangeFilter">
    <level value="ALL"/>
  </filter>
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%d{HH:mm:ss.fff} [%type] %-5p %message%n"/>
  </layout>
  <rollingStyle value="Date"/>
  <file value="C:/Logs/General_"/>
  <datePattern value="yyyy_MM_dd'.log'" />
  <appendToFile value="true"/>
  <staticLogFileName value="false"/>
</appender>

<!-- The Error appender rolls by date -->
<appender name="ErrorTextLog" type="log4net.Appender.RollingFileAppender">
  <filter type="log4net.Filter.LevelRangeFilter">
    <levelMin value="WARN"/>
    <levelMax value="FATAL"/>
  </filter>
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%d{HH:mm:ss.fff} [%type] %-5p %message%newline%exception"/>
  </layout>
  <rollingStyle value="Date"/>
  <file value="C:/Logs/Error_"/>
  <datePattern value="yyyy_MM_dd'.log'" />
  <appendToFile value="true"/>
  <staticLogFileName value="false"/>
</appender>

<!-- Loggers -->
<logger name="DefaultLogger">
  <appender-ref ref="GeneralTextLog"/>
  <level value="ALL"/>
</logger>

<logger name="ErrorLogger">
  <appender-ref ref="ErrorTextLog"/>
  <levelMin value="WARN"/>
  <levelMax value="FATAL"/>
</logger>

エラー ログの conversionPattern に %exception のみを含めたにもかかわらず、両方のログにスタック トレースが表示されます。これが起こらないようにする方法を知っている人はいますか?

4

2 に答える 2

41

次のようにレイアウトを構成します(GeneralTextLog Appender):

<layout type="log4net.Layout.PatternLayout">
    <IgnoresException value="False" />
    ...

falseに設定IgnoresExceptionすると、レイアウトが例外を処理することをアペンダーに通知します。したがって、スタックトレースを印刷しないことを選択できます。

于 2010-09-07T16:20:33.870 に答える
0

構成から、スタック トレースがmessageパラメーターの一部として含まれているようです。

編集- 私はもっと明確にすべきでした。私の推測では、log4net のロギング メソッドを呼び出したとき、最初のパラメーター (これはmessage) にスタック トレースが含まれていましたが、それは単なる推測にすぎません。また、両方のアペンダーの唯一のパラメーターでもあります。アペンダー形式にパラメーターがない場合、両方のログに表示されるべきではありません...もちろん、例外のあるアペンダーがプライマリアペンダーでない限り。

代わりにこれを試して、何が起こるか見てみましょう:

<!-- Loggers -->
<root>
  <appender-ref ref="GeneralTextLog"/>
  <level value="ALL"/>
</root>

<logger name="ErrorLogger">
  <appender-ref ref="ErrorTextLog"/>
  <levelMin value="WARN"/>
  <levelMax value="FATAL"/>
</logger>
于 2010-09-07T14:05:35.917 に答える