使用NLog记录异常时如何获取堆栈跟踪?

Jad*_*ias 53 .net exception nlog stack-trace

当我使用NLog的默认布局时,它只打印例外的名称.我被告知log4jxmlevent布局不会打印关于异常的任何内容.什么布局会对我有帮助?

示例代码:

try
{
    throw new SystemException();
}
catch (Exception ex)
{
    logger.Error("oi", ex);
}
Run Code Online (Sandbox Code Playgroud)

默认布局输出:

2011-01-14 09:14:48.0343|ERROR|ConsoleApplication.Program|oi
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

Jad*_*ias 93

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

logger.ErrorException("ex", ex);
Run Code Online (Sandbox Code Playgroud)

和自定义布局

layout="${exception:format=ToString,StackTrace}${newline}"
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,这种方法已被弃用.https://github.com/NLog/NLog/wiki/How-to-Log-Exceptions (10认同)
  • 请注意,使用"ToString"和"StackTrace"会导致日志输出中的堆栈跟踪重复.`$ {exception:format = ToString}`就足够了 (8认同)
  • 这是现有布局的补充吗? (4认同)
  • 解释@Clay的注释:日志行现在更改为`logger.Error("Got exception.",ex);`但是'自定义布局'很好 (4认同)

Cla*_*lay 19

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

catch(Exception crap)
{
    log.Error("Something went horribly wrong.", crap);
}
Run Code Online (Sandbox Code Playgroud)

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

<target ...
    layout="${longdate} ${message} ${exception:format=ToString}" />
Run Code Online (Sandbox Code Playgroud)

资料来源:


Edw*_*rey 15

如" 如何记录异常"中所述,从NLog 4.0开始,将异常作为第一个参数传递给Error,例如:

logger.Error(ex, "Nickers!");
Run Code Online (Sandbox Code Playgroud)

在NLog配置中(例如,在web.config或中app.config),包含${exception:format=tostring}在布局中,例如:

<target name="f" type="File" layout="${longdate} ${message} ${exception:format=tostring}"/> 
Run Code Online (Sandbox Code Playgroud)

  • 可以在布局中使用[条件格式](http://nlog-project.org/2011/04/20/exception-logging-enhancements.html)进行例外处理.以下是接近默认布局`<target name ="f"type ="File"layout ="$ {longdate} | $ {level:uppercase = true} | $ {message} $ {onexception:$ {newline} $ {例外:格式=的toString}}"/>`. (5认同)

Mic*_*age 7

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

logger.Error(exception, message);

和布局如下:

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

@装置序列化所有异常的属性为JSON格式