Конфигурирование NLog для регистрации исключений в выводе XML? - PullRequest
9 голосов
/ 11 августа 2010

В настоящее время NLog выплевывает файлы CSV только для того, чтобы доказать, что NLog фактически регистрирует исключения.

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" internalLogToConsole="true" internalLogToConsoleError="true">
<targets>
  <target name="file" xsi:type="File"  fileName="${specialfolder:folder=ApplicationData}/log.csv">
    <layout xsi:type="CSVLayout">
      <column name="User_Machine_Name" layout="${machinename}" />
      <column name="Time" layout="${date}" />
      <column name="Level" layout="${level}" />
      <column name="Message" layout="${message}" />
      <column name="Exception_Message" layout="${exception:format=Message}"/>
      <column name="Exception_Type" layout="${exception:format=Type}"/>
      <column name="Callsite_Class" layout="${callsite:methodName=false}" />
      <column name="Callsite_Method" layout="${callsite:className=false}" />
      <column name="Stack_Trace" layout="${stacktrace:format=DetailedFlat}"/>
    </layout>
  </target>
  <target name="console" xsi:type="Console"
    layout="${longdate}|${level}|${message}">
  </target>
</targets>
<rules>
  <logger name="*" minlevel="Trace" writeTo="file" />
</rules>

Это работает, как и ожидалось, за исключением того, что он мне нужен для вывода в XML. Я просмотрел документацию по NLog, и единственное, что я обнаружил, это то, что есть Log4JXmlEventLayout, но в документации не говорится о том, как его использовать. Я новичок в NLog и не могу найти слишком много ресурсов по этой теме.

Ответы [ 2 ]

10 голосов
/ 11 августа 2010

Насколько я могу судить, с Log4JXmlEventLayout связаны некоторые свойства (информация трассировки стека, класс вызова, время и т. Д.), Но это все.Я изучил, как включить дополнительную информацию, но кажется, что это невозможно.

Возможная конфигурация выглядит следующим образом:

<target name ="xmlFile" xsi:type="File"
                fileName="${tempdir}/${processname}/log.xml"
                archiveFileName="${tempdir}/${processname}/archive/log_{#####}.xml"
                archiveAboveSize="10000000"
                layout="${log4jxmlevent:includeSourceInfo=true:includeCallSite=true:includeMDC=true:appInfo=true:includeNDC=true:includeNLogData=true}"/>

Однако я обнаружил, что только NLog 2.0 на самом деле будет использовать такие атрибуты, как "includeSourceInfo".Мне показалось, что в NLog 1.0, когда они были установлены в true, полученный xml содержал только дату, уровень и сообщение.

Одна из причин не использовать Log4JXmlEventLayout заключается в том, что он ничего не делает сисключения, т. е. если вы позвоните

logger.ErrorException("This shouldn't happen", exception);

, регистратор запишет «Этого не должно быть», но информация об исключении исчезнет.

Возможно, можно было бы создать пользовательскийОбертка XML вокруг данных, которые вы хотите.Я не сделал этого, но я думаю об этом просто из-за ограничений вокруг Log4JXmlEventLayout.

0 голосов
/ 15 июня 2019

Начиная с NLog 4.6, существует макет XML.С этим макетом вы можете определить свой собственный XML.Например,

<target name="xmlFile" xsi:type="File" fileName="${logFileNamePrefix}.xml" >
      <layout xsi:type="XmlLayout" includeAllProperties="false" elementName='logevent'>
              <attribute name="time" layout="${longdate}" />
              <attribute name="level" layout="${level:upperCase=true}"/>
              <element name="message" value="${message}" />
      </layout>
</target>

будет писать:

<logevent time="2010-01-01 12:34:56.0000" level="ERROR">
   <message>hello, world</message>
</logevent>

См. документы

...