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

时间:2019-03-25 16:11:05

标签: 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-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>
  1. 测试xml文本。测试消息:
"<hello person=\"x\"><child>child value</child></hello>"

结果不缩进:

<logevent logger="Logs" callsite="WriteLogMessages.LogMessages" line="36">
  <message><hello person="x"><child>child value</child></hello></message>
</logevent>
  1. 测试属性。 LogEventInfo进行测试:
var root = new Dictionary<string, object>();
var branches = new Dictionary<string, object>();
var leaf = new Dictionary<string, object>();
leaf["leaf"] = "This is the leaf";
branches["branches"] = leaf;
root["root"] = branches;

var logEvent = new LogEventInfo();
logEvent.Level = logLevel;
logEvent.Message = 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>

1 个答案:

答案 0 :(得分:0)

总结和阐述评论,

有一个错误,已在NLog 4.6.1中修复

嵌套属性默认情况下不序列化。您需要 <layout xsi:type="XmlLayout" indentXml="true" maxRecursionLimit="10" ... /> (例如10,默认值为1)

所以在这种情况下:

{{1}}

请参见XML Layout docs