NLog能够通过${callsite:className=Boolean:fileName=Boolean:includeSourcePath=Boolean:methodName=Boolean}:
包含呼叫站点信息
渲染器。
我假设NLog获得堆栈跟踪以实现此功能。
我想知道是否是这种情况,或者NLog的优化是否超出了在每次日志记录调用时创建新的堆栈跟踪,以及在写入大量日志条目的应用程序中性能影响是什么?
答案 0 :(得分:4)
.NET框架不提供更多选项[1]来获取堆栈跟踪,而不是直接或通过StackTrace
或Exception
作为字符串使用Environment.StackTrace
类,所以NLog可以做的更多。此外,对于每个进行的日志调用,callstack将(可能)不同。一个例外是循环内的日志调用。但即使在这种情况下,也需要一些机制来帮助NLog甚至知道呼叫是从与前一个“相同的位置”进行的。这只能在(再次)在callstack处查看。
所以,总而言之,我认为NLog必须做到这一点:在每次进行日志调用时捕获callstack(虽然不是每个处理调用的布局/ appender) - 就像log4net一样,“警告“关于此选项是高性能日志调用的性能问题。
无论如何,您可能希望查看source,它也表示(虽然我没有在调试器中逐步执行),每个日志调用都会捕获一个callstack。
UPDATE 为了完整起见,从.NET 4.5开始,可以使用caller info attributes。他们有自己的“限制”,比如不包括typename。但是,NLog目前没有使用它们。
[1]除了可能在调试器中使用一些IL级重写或运行应用程序。