NLog似乎在数据库中写入了不正确的值

问题描述

我正在使用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);

下面是数据库中的示例行

enter image description here

我认为,“异常”字段中的值应写入“消息”列中,而“ 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 Document

我将我的nlog更改为以下内容,并且按预期工作

<parameter name="@Message" layout="${exception:format=message}" />
<parameter name="@Exception" layout="${exception:format=type}" />
<parameter name="@StackTrace" layout="${exception:format=stacktrace}" />

enter image description here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...