3

我正在尝试使用 Log4Net 将异常记录到数据库中。我正在使用 adonetappender,它确实有效,但不是最佳的。

如果我像这样配置异常参数...

<parameter>
  <parameterName value="@exception"/>
  <dbType value="String"/>
  <size value="-1"/>
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%exception"/>
  </layout>
</parameter>

它可以工作,但在没有异常时插入 "" 而不是 null。

如果我有这样的结果,我会得到相同的结果......

<parameter>
  <parameterName value="@exception"/>
  <dbType value="String"/>
  <size value="-1"/>
  <layout type="log4net.Layout.ExceptionLayout">
    <!-- <key value="exception" /> -->
    <!--<conversionPattern value="%exception"/>-->
  </layout>
</parameter>

但如果我有这样的

<parameter>
  <parameterName value="@exception"/>
  <dbType value="String"/>
  <size value="-1"/>
  <layout type="log4net.Layout.RawPropertyLayout">
    <key value="exception" />
  </layout>
</parameter>

它只插入空值...

问题可能来自我们有一个总是调用的静态日志记录包装器

LogManager.GetLogger("[GoodLife.Common.Logging]").Debug(message, e); // e being null if there is no exception. 

e当我在记录器上调用调试方法时,有没有办法让它插入空值(如果为空)?

关于布局的 log4net 文档并不是很有帮助,我从AdoNetAppender 参数的默认值中获得了最后一个配置

4

2 回答 2

4

问题是异常不是一个属性,因此 log4net 找不到任何带有“异常”键的东西,因此你总是得到空值。

为了解决您的问题,您可以像这样创建自己的布局转换器:

public class RawExceptionLayout : IRawLayout
{       
    public virtual object Format(LoggingEvent loggingEvent)
    {
         return loggingEvent.ExceptionObject;
    }       
}
于 2013-07-20T12:05:02.857 回答
0

您还可以通过 log4net 修改使用的插入语句,让 sql server 为您完成工作。这样做的好处是不需要更改代码!

默认示例配置

 <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) 
 VALUES (@log_date, @thread, @log_level, @logger, @message, 
@exception)" />

和我修改后的插入:

 <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) 
 VALUES (@log_date, @thread, @log_level, @logger, @message, 
case when  @exception &lt;&gt; '' then @exception else null end)" />

注意 < 和 > 所需的编码,因为它在 xml 中!

于 2016-05-04T13:07:38.317 回答