NLog 使用 WCF C#.NET 将对象写入数据库

NLog issue writing object to database using WCF C#.NET

我目前在使用 NLog 将 XML 值写入数据库 table 时遇到问题。我正在使用 WCF 和 C#

我有一个正在写入数据库的请求 XML 对象,如果我按如下方式使用内置 "message" 对象,它会起作用:

NLog.Config

<parameter name="@message" layout="${message}" />

后面的代码:

logger.Debug("{@value1}", new { request1 = request});

但是如果我尝试将它写入另一个字段,例如:

<parameter name="@Request" layout="${event-properties:value1}" />

它不会将对象的值写入 table,而是:

"MyServices.Types.Request"

请求类型是:

namespace MyServices.Types
{
    [DataContract]
    public class Request
    {
        [DataMember]
        public string MessageHeader { get; set; }
        [DataMember]
        public int EventType { get; set; }
        [DataMember]
        public string Identification { get; set; }
        [DataMember]
        public DateTime VisitDate { get; set; }

    }
}

这有什么原因吗? "Message" 属性 似乎可以正常工作

(这是针对旧版 NLog 的回答。最新的请参阅 Rolf 的回答)

即使使用结构化日志记录,事件属性也不会转换为结构化格式 - 它使用 ToString

目前只支持JSON序列化,不支持XML

<parameter name="@Request" layout="${event-properties:value1:format=@}" />

有关更多选项和示例,请参阅 ${event-properties} docs

NLog 4.6 允许您将 XML 渲染到 DatabaseTarget:

<parameter name="@Request" DbType="SqlDbType.Xml">
   <layout type="xmllayout" includeAllProperties="true" />
</parameter>

NLog 4.6 还允许您为参数设置 DbType。参见 https://github.com/NLog/NLog/wiki/XmlLayout