NLog 似乎在数据库中写入不正确的值
NLog seems to be writing incorrect value in database
我正在使用 NLog 登录数据库。在我看来,它在列中的价值错位。比如在Message栏写StackTrace,在StackTrace栏写Exception信息
配置:
<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);
下面是数据库中的示例行
在我看来,“Exception”字段中的值应该写在“Message”列中,“StackTrace”的值应该写在“Exception”列中,最后“Message”的值应该写在“ 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}" />
我正在使用 NLog 登录数据库。在我看来,它在列中的价值错位。比如在Message栏写StackTrace,在StackTrace栏写Exception信息
配置:
<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);
下面是数据库中的示例行
在我看来,“Exception”字段中的值应该写在“Message”列中,“StackTrace”的值应该写在“Exception”列中,最后“Message”的值应该写在“ 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}" />