请帮助我,请使用文件记录器登录的格式异常我想有例外,在内部异常(如果有的话)之间登录新的行分隔符,并带有某种特殊的符号,例如 [ArgumentException]
,以使其与错误文本不同,而旨在用tab则只是to to to to to to to to to使阅读堆栈跟踪
我已经检查了最新的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:projectsNLogTestProgram.cs:line 62
at NLogTest.Program.Main(String[] args) in d:projectsNLogTestProgram.cs:line 19
[ArgumentException] outer exception
at NLogTest.Classes.UnitOfWork.outerException() in d:projectsNLogTestProgram.cs:line 49
at NLogTest.Classes.UnitOfWork.tryException() in d:projectsNLogTestProgram.cs:line 57
[KeyNotFoundException] innerException
at NLogTest.Classes.UnitOfWork.innerException() in d:projectsNLogTestProgram.cs:line 38
at NLogTest.Classes.UnitOfWork.outerException() in d:projectsNLogTestProgram.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:projectsNLogTestProgram.cs:line 40
at NLogTest.Classes.UnitOfWork.outerException() in d:projectsNLogTestProgram.cs:line 47
--- End of inner exception stack trace ---
at NLogTest.Classes.UnitOfWork.outerException() in d:projectsNLogTestProgram.cs:line 51
at NLogTest.Classes.UnitOfWork.tryException() in d:projectsNLogTestProgram.cs:line 59
--- End of inner exception stack trace ---
at NLogTest.Classes.UnitOfWork.tryException() in d:projectsNLogTestProgram.cs:line 64
at NLogTest.Program.Main(String[] args) in d:projectsNLogTestProgram.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:projectsNLogTestProgram.cs:line 64
at NLogTest.Program.Main(String[] args) in d:projectsNLogTestProgram.cs:line 20
ArgumentException*outer exception* at NLogTest.Classes.UnitOfWork.outerException() in d:projectsNLogTestProgram.cs:line 51
at NLogTest.Classes.UnitOfWork.tryException() in d:projectsNLogTestProgram.cs:line 59
KeyNotFoundException*innerException* at NLogTest.Classes.UnitOfWork.innerException() in d:projectsNLogTestProgram.cs:line 40
at NLogTest.Classes.UnitOfWork.outerException() in d:projectsNLogTestProgram.cs:line 47
但是很难阅读。第一个堆栈跟踪线与异常消息在同一行。内部错误消息的意图,但内部堆栈跟踪 - 否。
我错过了一些布局吗?我应该创建自定义异常布局渲染器吗?这是我用来提出异常的C#源代码
编写nlog布局渲染器足够简单,因此我设法根据要求的格式创建了异常布局渲染器。
可以在GIST上找到最新的自定义布局源代码版本也可以使用用于控制台和文件记录器的示例配置。
upd 也有nlog.indentexception nuget软件包。
此外,我添加了堆栈跟踪过滤器。有时,例外被记录不止一次。可能是因为设计不良(仅应记录一次例外),或者可能是因为可以从外部代码中使用相同的方法(因此在抛弃之前应在本地记录异常)或同一解决方案中的其他方法。在这种情况下,内部异常可以多次记录。为了减少堆栈跟踪,如果以前记录了异常,我添加了跳过堆栈跟踪记录的可能性。在这种情况下,仅记录了异常类型和消息。如下:
[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:projectsNLogTestProgram.cs:line 48
at NLogTest.Classes.UnitOfWork.tryException() in d:projectsNLogTestProgram.cs:line 56
[KeyNotFoundException] innerException
at NLogTest.Classes.UnitOfWork.innerException() in d:projectsNLogTestProgram.cs:line 37
at NLogTest.Classes.UnitOfWork.outerException() in d:projectsNLogTestProgram.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:projectsNLogTestProgram.cs:line 61
at NLogTest.Program.Main(String[] args) in d:projectsNLogTestProgram.cs:line 17
[ArgumentException] outer exception
[KeyNotFoundException] innerException
外部异常和innerexception被记录了两次。第一次被捕获为外部例外,其次是将其记录为内部例外。但是,由于日志包含堆栈跟踪,已经只有例外类型和消息记录。