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 Document

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

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