63

当我使用 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>

4

4 回答 4

102

我不得不使用Logger.+ Level +Exception方法之一:

logger.ErrorException("ex", ex);

和自定义布局

layout="${exception:format=ToString,StackTrace}${newline}"
于 2011-01-14T12:31:58.033 回答
22

使用将异常作为第二个参数的重载:

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

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

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

资料来源:

于 2014-12-31T22:03:26.243 回答
22

How to Log Exceptions中所述,从 NLog 4.0 开始,将异常作为第一个参数传递给Error,例如:

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

在 NLog 配置中(例如 inweb.configapp.config),包括${exception:format=tostring}在布局中,例如这样:

<target name="f" type="File" layout="${longdate} ${message} ${exception:format=tostring}"/> 
于 2015-07-01T15:46:20.217 回答
10

从 NLog 4.5 开始,您现在可以使用:

logger.Error(exception, message);

和布局如下:

"${longdate} ${level} ${message} ${exception:format=@}"

@所有异常属性序列化为 Json 格式的方法

于 2019-01-09T09:44:04.483 回答