问题描述
我正在使用NLog登录数据库。在我看来,它在各栏中的价值错位。例如,它在Message列中写入StackTrace,在StackTrace列中写入异常信息
配置:
<nlog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" throwConfigExceptions="true" throwExceptions="true">
<targets>
<target name="database" type="Database" connectionString="Data Source=Server1;initial catalog=MyDb;Integrated Security=True;">
<commandText>insert into dbo.AppException ([Level],Logger,Message,Exception,StackTrace) values (@Level,@Logger,@Message,@Exception,@StackTrace);</commandText>
<parameter name="@Level" layout="${level}" />
<parameter name="@Logger" layout="${logger}" />
<parameter name="@Message" layout="${message}" />
<parameter name="@Exception" layout="${exception}" />
<parameter name="@StackTrace" layout="${stacktrace}" />
<dbProvider>System.Data.sqlClient</dbProvider>
</target>
</targets>
<rules>
<logger name="*" minlevel="Error" writeto="database" />
</rules>
</nlog>
我的测试代码:
throw new IOException("This is my message");
logger.Error(ex);
下面是数据库中的示例行
我认为,“异常”字段中的值应写入“消息”列中,而“ StackTrace”的值应写入“异常”列中,最后“消息”的值应写入“ StackTrace”中
我的配置有什么问题吗?还是我的期望是错误的?
解决方法
我猜你正在记录这样的异常:
catch (Exception ex)
{
_logger.Error(ex); // ${message} will become ex.ToString(),since no message provided.
}
如果改为此:
catch (Exception ex)
{
_logger.Error(ex,"Exception caught while testing");
}
并将NLog.config
更新为此:
<parameter name="@Exception" layout="${exception:format=tostring,data}" />
那么您可能会得到想要的东西。
,阅读@Rolf发布的答案后,我发现我的nlog.config设置不正确。 nlog中的格式设置很重要
我将我的nlog更改为以下内容,并且按预期工作
<parameter name="@Message" layout="${exception:format=message}" />
<parameter name="@Exception" layout="${exception:format=type}" />
<parameter name="@StackTrace" layout="${exception:format=stacktrace}" />