使用NLogloggingexception时如何获取堆栈跟踪?

当我使用NLog的默认布局时,它只打印exception的名称。 我已经被告知log4jxmlevent布局不会打印任何exception。 什么布局会帮助我?

示例代码:

try { throw new SystemException(); } catch (Exception ex) { logger.Error("oi", ex); } 

默认布局输出:

 2011-01-14 09:14:48.0343|ERROR|ConsoleApplication.Program|oi 

log4jxmlevent输出:

 <log4j:event logger="ConsoleApplication.Program" level="ERROR" timestamp="1295003776872" thread="9"> <log4j:message>oi</log4j:message> <log4j:NDC /> <log4j:locationInfo class="ConsoleApplication.Program" method="Void Main(System.String[])" file="C:\Users\User\Documents\Visual Studio 2010\Projects\ConsoleApplication\ConsoleApplication\Program.cs" line="21" /> <nlog:eventSequenceNumber>3</nlog:eventSequenceNumber> <nlog:locationInfo assembly="ConsoleApplication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <log4j:properties> <log4j:data name="log4japp" value="true" /> <log4j:data name="log4jmachinename" value="MACHINE" /> </log4j:properties> 

我必须使用Logger. +级别+ Exception方法:

 logger.ErrorException("ex", ex); 

和自定义布局

 layout="${exception:format=ToString,StackTrace}${newline}" 

使用带有Exception的重载作为第二个参数:

 catch(Exception crap) { log.Error("Something went horribly wrong.", crap); } 

然后在布局中包含${exception}布局渲染器:

 <target ... layout="${longdate} ${message} ${exception:format=ToString}" /> 

资料来源:

正如“ 如何loggingexception”中所述 ,从NLog 4.0开始,将exception作为第一个parameter passing给Error ,例如:

 logger.Error(ex, "Nickers!"); 

在NLogconfiguration中(例如在web.configapp.config ),在布局中包含${exception:format=tostring} ,例如:

 <target name="f" type="File" layout="${longdate} ${message} ${exception:format=tostring}"/>