2017-10-04 93 views
1

帮助我请格式化与文件记录器记录的异常 我想异常类型包围内部异常(如果有的话)之间的新行分隔符记录使用一些特殊类型的符号,如[ArgumentException]使其与错误文本不同,并且要使用选项卡以便易于读取堆栈跟踪的例外nlog异常布局来格式化异常类型,消息和堆栈跟踪

我已经检查了最新的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 rendererHere is我用来提升异常的c#源代码

回答

1

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

最新的自定义布局源代码版本可以是found on gist 控制台和文件记录器is available 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 

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

相关问题