В настоящее время у нас есть 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, и я не могу найти слишком много ресурсов на предмете.
Насколько я могу судить, 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.