使用NLog Exception Renderer限制堆栈跟踪显示深度

时间:2017-04-11 09:45:53

标签: .net exception logging stack-trace nlog

我正在使用NLog 4.4.5在我的Owin Web Api 2项目中执行一些异常日志记录,并且我希望包含我的异常的部分堆栈跟踪(即顶部日志中的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

但是,当使用异常布局渲染器StackFrame格式属性(这是执行异常日志记录的推荐方法)时,文档未指定与{{1}的等效项用于过滤堆栈跟踪的显示。

有没有人找到解决方法?

1 个答案:

答案 0 :(得分:1)

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

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

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

    [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")
    2. 用法${myException:format=ShortType, Message, StackTrace:StackDepth=3}