Как создать NLog XmlLayout с сообщением с отступом xml? - PullRequest
1 голос
/ 25 марта 2019

В версии 4.6 NLog были добавлены некоторые новые функции. Один из них - 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 голосов
/ 24 июня 2019

Чтобы обобщить и разработать комментарии,

Произошла ошибка, исправленная в NLog 4.6.1

Вложенные свойства не сериализуются по умолчанию. Вам нужно MaxRecursionLimit (например, 10, по умолчанию 1),

Так что в этом случае:

 <layout xsi:type="XmlLayout" indentXml="true" 
         maxRecursionLimit="10"
 ... />

См. Документы XML Layout

...