【问题标题】:log4net adonetAppender won't insert null values into the databaselog4net adonetAppender 不会将空值插入数据库
【发布时间】:2013-07-19 17:38:33
【问题描述】:

我正在尝试使用 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 文档并不是很有帮助,我从 Default values for AdoNetAppender parameter 获得了最后一个配置

【问题讨论】:

    标签: log4net log4net-configuration log4net-appender


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢@Stefan,但我不确定我是否看到它是如何创建带有“异常”键的属性的。我确定你是对的,但我只是不明白答案。
    • 它不会创建一个属性,它是一个不同的布局,只是通过异常。这样@exception 参数直接获取异常。不得不承认我没有测试过,所以可能需要先把异常(如果不是null的话)转成字符串,不过这个应该很容易搞清楚。
    • 感谢您的帮助。 :)
    • 不客气。我现在明白你为什么会感到困惑了:我更改了类的名称以便更有意义。
    • @StefanEgli 正如您已经提到的,如果ExceptionObject 不为空,您必须返回一个字符串。谢谢。
    【解决方案2】:

    您也可以通过 log4net 修改使用的插入语句,让 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 中!

    【讨论】:

      猜你喜欢
      • 2017-11-05
      • 2019-04-08
      • 2016-03-06
      • 2015-11-22
      • 2017-02-19
      • 1970-01-01
      • 2021-09-01
      • 2018-11-10
      • 1970-01-01
      相关资源
      最近更新 更多