nlog 异常布局以格式化异常类型、消息和堆栈跟踪
nlog exception layout to format exception type, message and stack trace
请帮我格式化用文件记录器记录的异常
我希望在内部异常(如果有的话)之间使用换行符记录异常,异常类型用某种特殊符号包围,例如 [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
内部异常消息堆栈跟踪在日志中分离(因此以后很难读取日志)以防异常被重新抛出超过两次
并且异常类型名称前没有制表符 (space)。
我得到的最好结果是下面的布局
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# 源代码
编写 NLog 布局渲染器非常简单,所以我设法创建了异常布局渲染器,它完全按照请求格式化异常。
最新的自定义布局源码版本可以found on gist
控制台和文件记录器的示例配置 is available also.
UPD 有NLog.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
外部异常和内部异常被记录了两次。第一次是捕获外部异常,第二次是将它们记录为内部异常。
但是,由于日志包含堆栈跟踪,因此仅记录了异常类型和消息。
请帮我格式化用文件记录器记录的异常
我希望在内部异常(如果有的话)之间使用换行符记录异常,异常类型用某种特殊符号包围,例如 [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
内部异常消息堆栈跟踪在日志中分离(因此以后很难读取日志)以防异常被重新抛出超过两次 并且异常类型名称前没有制表符 (space)。
我得到的最好结果是下面的布局
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# 源代码
编写 NLog 布局渲染器非常简单,所以我设法创建了异常布局渲染器,它完全按照请求格式化异常。
最新的自定义布局源码版本可以found on gist 控制台和文件记录器的示例配置 is available also.
UPD 有NLog.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
外部异常和内部异常被记录了两次。第一次是捕获外部异常,第二次是将它们记录为内部异常。 但是,由于日志包含堆栈跟踪,因此仅记录了异常类型和消息。