当我使用NLog的默认布局时,它只打印例外的名称。 我被告知log4jxmlevent布局不会打印关于异常的任何内容。 什么布局会对我有帮助?
示例代码:
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>
答案 0 :(得分:89)
我必须使用Logger.
+ Level + Exception
方法之一:
logger.ErrorException("ex", ex);
和自定义布局
layout="${exception:format=ToString,StackTrace}${newline}"
答案 1 :(得分:17)
使用以Exception作为第二个参数的重载:
catch(Exception crap)
{
log.Error("Something went horribly wrong.", crap);
}
然后在您的布局中包含${exception}
布局渲染器:
<target ...
layout="${longdate} ${message} ${exception:format=ToString}" />
来源:
答案 2 :(得分:14)
如How to Log Exceptions中所述,从NLog 4.0开始,将异常作为第一个参数传递给Error
,例如:
logger.Error(ex, "Nickers!");
在NLog配置中(例如在web.config
或app.config
中),在布局中包含${exception:format=tostring}
,例如:
<target name="f" type="File" layout="${longdate} ${message} ${exception:format=tostring}"/>
答案 3 :(得分:1)
从NLog 4.5开始,您现在可以使用:
logger.Error(exception, message);
和布局如下:
"${longdate} ${level} ${message} ${exception:format=@}"
@
意味着将所有Exception-properties序列化为Json格式