【问题标题】:How to get the Stack trace when logging exceptions with NLog?使用 NLog 记录异常时如何获取堆栈跟踪?
【发布时间】:2011-06-08 17:40:43
【问题描述】:

当我使用 NLog 的默认布局时,它只打印异常的名称。 我被告知 log4jxmlevent 布局没有打印任何关于异常的信息。 什么布局对我有帮助?

示例代码:

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

默认布局输出:

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

log4jxml事件输出:

<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>

【问题讨论】:

    标签: .net exception stack-trace nlog


    【解决方案1】:

    我必须使用Logger. + Level + Exception 方法之一:

    logger.ErrorException("ex", ex);
    

    和自定义布局

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

    【讨论】:

    • 这是对现有布局的补充吗?
    • @Shane 当然,除非你只需要堆栈跟踪
    • 仅供参考,这种方法已被弃用。 github.com/NLog/NLog/wiki/How-to-Log-Exceptions
    • 解释@Clay 的评论:日志行现在更改为logger.Error("Got exception.", ex);,但“自定义布局”很好
    • 请注意,同时使用ToStringStackTrace 会导致日志输出中的堆栈跟踪重复。 ${exception:format=ToString} 就够了
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 可以在异常布局中使用Conditional Formatting。以下接近于默认布局&lt;target name="f" type="File" layout="${longdate}|${level:uppercase=true}|${message}${onexception:${newline}${exception:format=tostring}}"/&gt;
    【解决方案3】:

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

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

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

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

    来源:

    【讨论】:

      【解决方案4】:

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

      logger.Error(exception, message);

      布局如下:

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

      @ 表示将所有异常属性序列化为 Json 格式

      【讨论】:

      • 这是我一直在寻找的答案 - 在日志中获取完整的 Json 版本的异常,而不仅仅是异常类型和消息
      猜你喜欢
      • 1970-01-01
      • 2013-02-21
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多