我正在尝试使用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获得了最后一个配置
答案 0 :(得分:4)
问题是异常不是属性,因此log4net找不到任何带有“异常”键的东西,因此你总是得到null。
为了解决您的问题,您可以创建自己的布局转换器,如下所示:
public class RawExceptionLayout : IRawLayout
{
public virtual object Format(LoggingEvent loggingEvent)
{
return loggingEvent.ExceptionObject;
}
}
答案 1 :(得分:0)
您还可以通过log4net修改使用的insert语句,让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 <> '' then @exception else null end)" />
注意&lt;所需的编码和&gt;因为它是在xml!