目前,我们有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的新手,我找不到太多关于这个主题的资源。
答案 0 :(得分:10)
据我所知,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的限制而考虑它。
答案 1 :(得分:0)
自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>
请参见docs