Log4Net - 仅针对某些文件注销Exception堆栈跟踪

时间:2010-09-07 13:57:32

标签: .net log4net log4net-configuration

我目前在我的应用程序中使用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>

尽管我在convertPattern中只为错误日志包含了%exception,但堆栈跟踪仍出现在两个日志中。有谁知道我怎么能阻止这种情况发生?

2 个答案:

答案 0 :(得分:39)

像这样配置布局(GeneralTextLog Appender):

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

IgnoresException设置为false会告诉appender布局将处理异常。因此,您可以选择不打印堆栈跟踪。

答案 1 :(得分:0)

从您的配置中,您的堆栈跟踪看起来像是message参数的一部分。

编辑 - 我应该更清楚。我的猜测是,当你调用log4net的日志记录方法时,你的第一个参数(message)包含了堆栈跟踪,但这只是猜测。它也是两个appender中唯一的参数。如果您的appender格式中没有参数,则它不应出现在两个日志中......除非您的appender具有例外是主要的appender。

试试这个,看看会发生什么:

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

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