首页 文章

log4net adonetAppender不会将空值插入数据库

提问于
浏览
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.

当我在 Logger 上调用调试方法时,如果 e 为null,有没有办法让它插入空值?

关于布局的log4net文档并没有那么有用,我从Default values for AdoNetAppender parameter获得了最后的配置

2 回答

  • 4

    问题是异常不是属性,因此log4net找不到任何带有“异常”键的东西,因此你总是得到null .

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

    public class RawExceptionLayout : IRawLayout
    {       
        public virtual object Format(LoggingEvent loggingEvent)
        {
             return loggingEvent.ExceptionObject;
        }       
    }
    
  • 0

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

    默认sample config

    <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中!

相关问题