log4net adonetAppender赢得';t在数据库中插入空值

log4net adonetAppender赢得';t在数据库中插入空值,log4net,log4net-configuration,log4net-appender,Log4net,Log4net Configuration,Log4net Appender,我正在尝试使用Log4Net将异常记录到数据库中。我正在使用adonetappender,它确实可以工作,但不是最理想的 如果我像这样配置异常参数 它可以工作,但在没有异常时插入“”而不是null 我得到同样的结果,如果我有这样的 但是如果我有这样的 它只插入空值 问题可能来自于我们有一个总是调用 LogManager.GetLogger(“[GoodLife.Common.Logging]”)。调试(消息,e);//如果没有异常,则e为空。 当我调用记录器上的调试方法时,如果e为

我正在尝试使用Log4Net将异常记录到数据库中。我正在使用adonetappender,它确实可以工作,但不是最理想的

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


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

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


但是如果我有这样的


它只插入空值

问题可能来自于我们有一个总是调用

LogManager.GetLogger(“[GoodLife.Common.Logging]”)。调试(消息,e);//如果没有异常,则e为空。
当我调用记录器上的调试方法时,如果
e
为null,是否有办法让它插入null


布局上的log4net文档并没有多大帮助,我从

获得了最后一个配置。问题是异常不是一个属性,因此log4net找不到任何带有键“exception”的内容,因此总是为null

为了解决您的问题,您可以创建自己的布局转换器,如下所示:

public类RawExceptionLayout:IRawLayout
{       
公共虚拟对象格式(LoggingEvent LoggingEvent)
{
返回loggingEvent.ExceptionObject;
}       
}

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

默认值:


和我的修改插入:

 <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格式的

谢谢@Stefan,但我不确定我是否看到它如何创建一个键为“exception”的属性。我相信你是对的,但我不明白答案。它不创建属性,它是一个不同的布局,只是通过异常。通过这种方式,@exception参数直接获取异常。我必须承认我没有测试它,所以可能是您需要先将异常(如果不是null)转换为字符串,但这应该很容易理解。谢谢您的帮助。:)不客气。我现在明白你为什么会感到困惑了:我更改了类的名称,这样它才更有意义。@StefanEgli,正如你已经提到的,如果
ExceptionObject
不为空,你必须返回一个字符串。谢谢
 <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)" />