C# 如何使用缩进的xml消息创建NLog XmlLayout?

C# 如何使用缩进的xml消息创建NLog XmlLayout?,c#,nlog,C#,Nlog,在NLog的4.6版本中添加了一些新功能。其中之一是XMLLayout。有没有办法将xml格式的消息以正确的缩进保存在XMLLayout目标中?另外一个问题是,如何对分层属性值输出执行相同的操作 下面是我的配置和消息代码 <target name="xmlFile" xsi:type="File" fileName="my_log.xml" maxArchiveFiles="3" archiveNumbering="Sequence" archiveDateFormat="dd-mm-yy

在NLog的4.6版本中添加了一些新功能。其中之一是XMLLayout。有没有办法将xml格式的消息以正确的缩进保存在XMLLayout目标中?另外一个问题是,如何对分层属性值输出执行相同的操作

下面是我的配置和消息代码

<target name="xmlFile" xsi:type="File" fileName="my_log.xml" maxArchiveFiles="3" archiveNumbering="Sequence" archiveDateFormat="dd-mm-yyyy" archiveOldFileOnStartup="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <layout xsi:type="XmlLayout" indentXml="true" includeAllProperties="true" includeMdc="true">
    <attribute name="logger" layout="${logger}" />
    <attribute name="callsite" layout="${callsite}" />
    <attribute name="line" layout="${callsite-linenumber}" />
    <element name="message" value="${message}" />
    <element name="exception" value="${exception:format=toString}" />
  </layout>
</target>

  • 测试xml文本。测试消息:
  • “子值”
    
    结果不缩进:

    <logevent logger="Logs" callsite="WriteLogMessages.LogMessages" line="36">
      <message><hello person="x"><child>child value</child></hello></message>
    </logevent>
    
    
    子值
    
  • 测试性能。用于测试的LogEventInfo:
  • var root=newdictionary();
    var branchs=newdictionary();
    var leaf=新字典();
    叶[“叶”]=“这是叶”;
    分枝[“分枝”]=叶;
    根[“根”]=分支;
    var logEvent=new LogEventInfo();
    logEvent.Level=logLevel;
    logEvent.Message=消息;
    logEvent.Properties[“Properties test”]=root;
    
    结果:

    <logevent logger="Logs" callsite="WriteLogMessages.LogMessages" line="26">
      <message>Test message.</message>
      <property key="properties test">
      <property key="root">
    </property>
    
    
    测试消息。
    
    我知道可能需要在Dictionary上创建一个包装器并重写ToString(),但结果是问题1

    预期结果:

    <logevent logger="Logs" callsite="WriteLogMessages.LogMessages" line="36">
      <message>
        <hello person="x">
          <child>child value</child>
        </hello>
      </message>
    </logevent>
    
    
    子值
    
    要总结和阐述这些评论

    NLog 4.6.1中修复了一个bug

    默认情况下,嵌套属性不会序列化。您需要
    MaxRecursionLimit
    (例如,10,默认值为1)

    因此,在这种情况下:

    
    

    请参见

    以总结和阐述评论

    NLog 4.6.1中修复了一个bug

    默认情况下,嵌套属性不会序列化。您需要
    MaxRecursionLimit
    (例如,10,默认值为1)

    因此,在这种情况下:

    
    

    请参阅

    感谢您报告您认为是功能之一的此错误:)。NLog应该对消息字符串执行xml编码。NLog不会尝试将您的随机消息字符串解析为xml,然后将其再次输出为缩进的xml。默认情况下,NLog XmlLayout将只执行对象属性的简单反射(以避免序列化整个世界)。但是如果您有一个带有集合的高级对象图,那么您可以配置
    MaxRecursionLimit=10
    另请参见Ok!谢谢!NLog 4.6.1已经发布,修复了这个bug/特性:感谢您报告这个您认为是特性的bug:)。NLog应该对消息字符串执行xml编码。NLog不会尝试将您的随机消息字符串解析为xml,然后将其再次输出为缩进的xml。默认情况下,NLog XmlLayout将只执行对象属性的简单反射(以避免序列化整个世界)。但是如果您有一个带有集合的高级对象图,那么您可以配置
    MaxRecursionLimit=10
    另请参见Ok!谢谢!NLog 4.6.1已经发布,修复了以下缺陷/功能:
    <logevent logger="Logs" callsite="WriteLogMessages.LogMessages" line="26">
      <message>Test message.</message>
      <property key="properties test">
      <property key="root">
    </property>
    
    <logevent logger="Logs" callsite="WriteLogMessages.LogMessages" line="36">
      <message>
        <hello person="x">
          <child>child value</child>
        </hello>
      </message>
    </logevent>