【问题标题】:nlog exception layout to format exception type, message and stack trace用于格式化异常类型、消息和堆栈跟踪的 nlog 异常布局
【发布时间】:2017-10-04 13:04:06
【问题描述】:

请帮助我格式化使用文件记录器记录的异常 我希望在内部异常(如果有的话)之间使用新行分隔符记录异常,异常类型用一些特殊类型的符号包围,例如[ArgumentException],以使其与错误文本不同,以及使用制表符设计的异常只是为了便于阅读堆栈跟踪

我检查了最新的 NLog 4.4.12 包,但问题是参数化默认布局并不是那么容易得到类似的东西

2017-10-04 15:13:22.5823 NLogTest.Program starting
2017-10-04 15:13:22.5823 NLogTest.Program failed to start NLogTest
    [ArgumentException] bad try 
       at NLogTest.Classes.UnitOfWork.tryException() in d:\projects\NLogTest\Program.cs:line 62
       at NLogTest.Program.Main(String[] args) in d:\projects\NLogTest\Program.cs:line 19
    [ArgumentException] outer exception
       at NLogTest.Classes.UnitOfWork.outerException() in d:\projects\NLogTest\Program.cs:line 49
       at NLogTest.Classes.UnitOfWork.tryException() in d:\projects\NLogTest\Program.cs:line 57
    [KeyNotFoundException] innerException
       at NLogTest.Classes.UnitOfWork.innerException() in d:\projects\NLogTest\Program.cs:line 38
       at NLogTest.Classes.UnitOfWork.outerException() in d:\projects\NLogTest\Program.cs:line 45
2017-10-04 15:13:22.5823 NLogTest.Program the end

这是我想要获取的异常文件日志。 我试过像

这样的布局
layout="${longdate} ${logger} ${message}${onexception:${newline}${exception:format=tostring}}"

它使用标准的tostring异常方法但结果不一样。我不喜欢这样

2017-10-04 15:28:52.6881 NLogTest.Program failed to start NLogTest
System.ArgumentException: bad try ---> System.ArgumentException: outer exception ---> System.Collections.Generic.KeyNotFoundException: innerException
   at NLogTest.Classes.UnitOfWork.innerException() in d:\projects\NLogTest\Program.cs:line 40
   at NLogTest.Classes.UnitOfWork.outerException() in d:\projects\NLogTest\Program.cs:line 47
   --- End of inner exception stack trace ---
   at NLogTest.Classes.UnitOfWork.outerException() in d:\projects\NLogTest\Program.cs:line 51
   at NLogTest.Classes.UnitOfWork.tryException() in d:\projects\NLogTest\Program.cs:line 59
   --- End of inner exception stack trace ---
   at NLogTest.Classes.UnitOfWork.tryException() in d:\projects\NLogTest\Program.cs:line 64
   at NLogTest.Program.Main(String[] args) in d:\projects\NLogTest\Program.cs:line 20

内部异常消息堆栈跟踪在日志中被分离(因此以后很难读取日志)以防异常被重新抛出两次以上 并且异常类型名称前没有制表符(空格)。

我得到的最好结果是下面的布局

layout="${longdate} ${logger} ${message}${onexception:${newline}${exception:maxInnerExceptionLevel=10:format=shortType,message,stacktrace:separator=*:innerExceptionSeparator=
	}}"

它是

2017-10-04 15:49:02.6188 NLogTest.Program failed to start NLogTest
ArgumentException*bad try*   at NLogTest.Classes.UnitOfWork.tryException() in d:\projects\NLogTest\Program.cs:line 64
   at NLogTest.Program.Main(String[] args) in d:\projects\NLogTest\Program.cs:line 20
    ArgumentException*outer exception*   at NLogTest.Classes.UnitOfWork.outerException() in d:\projects\NLogTest\Program.cs:line 51
   at NLogTest.Classes.UnitOfWork.tryException() in d:\projects\NLogTest\Program.cs:line 59
    KeyNotFoundException*innerException*   at NLogTest.Classes.UnitOfWork.innerException() in d:\projects\NLogTest\Program.cs:line 40
   at NLogTest.Classes.UnitOfWork.outerException() in d:\projects\NLogTest\Program.cs:line 47

但是它很难阅读。第一个堆栈跟踪行与异常消息在同一行。内部错误消息是有意的,但内部堆栈跟踪 - 没有。

布局中有什么我错过的吗? 我应该create custom exception layout renderer 吗? Here is我用来引发异常的c#源代码

【问题讨论】:

    标签: c# exception nlog


    【解决方案1】:

    编写 NLog 布局渲染器非常简单,因此我设法创建了异常布局渲染器,该渲染器可以完全按照请求格式化异常。

    最新的自定义布局源码版本可以是found on gist 控制台和文件记录器is available also的示例配置。

    UPDNLog.IndentException NuGet package also

    此外,我还添加了堆栈跟踪过滤器。有时会多次记录异常。可能是因为糟糕的设计(异常应该只记录一次)或者可能是因为可以从外部代码使用相同的方法(因此应该在抛出异常之前在本地记录异常)或同一解决方案中的其他方法。在这种情况下,可以多次记录内部异常。为了减少堆栈跟踪,如果之前记录了异常,我添加了跳过堆栈跟踪记录的可能性。在这种情况下,仅记录异常类型和消息。如下:

    [1] 2017-10-04 16:55:17.2227 Debug NLogTest.Program starting
    [1] 2017-10-04 16:55:17.2527 Error NLogTest.Classes.UnitOfWork tryException failure
        [ArgumentException] outer exception
            at NLogTest.Classes.UnitOfWork.outerException() in d:\projects\NLogTest\Program.cs:line 48
            at NLogTest.Classes.UnitOfWork.tryException() in d:\projects\NLogTest\Program.cs:line 56
        [KeyNotFoundException] innerException
            at NLogTest.Classes.UnitOfWork.innerException() in d:\projects\NLogTest\Program.cs:line 37
            at NLogTest.Classes.UnitOfWork.outerException() in d:\projects\NLogTest\Program.cs:line 44
    [1] 2017-10-04 16:55:17.2697 Error NLogTest.Program failed to start NLogTest
        [ArgumentException] bad try
            at NLogTest.Classes.UnitOfWork.tryException() in d:\projects\NLogTest\Program.cs:line 61
            at NLogTest.Program.Main(String[] args) in d:\projects\NLogTest\Program.cs:line 17
        [ArgumentException] outer exception
        [KeyNotFoundException] innerException
    

    外部异常和内部异常被记录两次。第一次是外部异常被捕获,第二次是它们被记录为内部异常。 但是,由于日志包含堆栈跟踪,因此只记录了异常类型和消息。

    【讨论】:

    猜你喜欢
    • 2013-04-08
    • 2011-01-05
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 2017-08-06
    • 2010-09-13
    • 1970-01-01
    相关资源
    最近更新 更多