使用 NLog 异常渲染器限制堆栈跟踪显示深度

Limiting Stack Trace display depth with NLog Exception Renderer

我正在使用 NLog 4.4.5 在我的 Owin Web Api 2 项目中执行一些异常记录,我想包含一个 partial 堆栈跟踪我在日志中的例外情况(即堆栈的 前 n 帧 )。

我目前的布局如下:

layout="${longdate} | ${pad:padding=5:inner=${level:uppercase=true}} | ${logger} | ${message} ${onexception:| ${exception:format=ShortType, Message, StackTrace}}"

我已经知道 NLog 允许在 global ${stacktrace} renderer 中通过 topFrames 属性进行这样的配置:

${stacktrace:format=Enum:topFrames=Integer:skipFrames=Integer:separator=String

但是,当使用 Exception 布局渲染器 StackFrame 格式属性时,这是执行异常日志记录的推荐方式,文档没有指定等效的topFrames 用于过滤堆栈跟踪的显示。

有没有人找到解决方法?

如果没有代码,这确实是不可能的。 ${stacktrace} 渲染器,渲染日志调用的堆栈跟踪,而不是异常。

但是使用一些代码这是可能的。此示例使用 NLog 4.4:

  1. ExceptionLayoutRenderer
  2. 创建一个子类
  3. 覆盖(它是虚拟的)AppendStackTrace 方法。

例如

[LayoutRenderer("myException")]
[ThreadAgnostic]
public class MyExceptionLayoutRenderer : ExceptionLayoutRenderer 
{
    //new option, settable from config
    public int StackDepth {get;set;}

    protected override void AppendStackTrace(StringBuilder sb, Exception ex)
    {
        //sb.Append(...)
    }


} 
  1. 如果没有单独的dll,不要忘记注册它。尽快:LayoutRenderer.Register<MyExceptionLayoutRenderer>("myException")

用法${myException:format=ShortType, Message, StackTrace:StackDepth=3}