9

目前,我们有 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 的新手,我找不到太多关于这个主题的资源。

4

2 回答 2

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 周围的限制。

于 2010-08-11T17:28:35.680 回答
1

从 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}" />
              <element name="exception_type" layout="${exception:format=Type}"/>
      </layout>
</target>

会写:

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

查看文档

于 2019-06-14T23:21:12.327 回答