NLog中Callsite布局渲染器的性能影响

时间:2012-09-03 10:44:10

标签: .net performance nlog

NLog能够通过${callsite:className=Boolean:fileName=Boolean:includeSourcePath=Boolean:methodName=Boolean}:包含呼叫站点信息 渲染器。

我假设NLog获得堆栈跟踪以实现此功能。

我想知道是否是这种情况,或者NLog的优化是否超出了在每次日志记录调用时创建新的堆栈跟踪,以及在写入大量日志条目的应用程序中性能影响是什么?

1 个答案:

答案 0 :(得分:4)

.NET框架不提供更多选项[1]来获取堆栈跟踪,而不是直接或通过StackTraceException作为字符串使用Environment.StackTrace类,所以NLog可以做的更多。此外,对于每个进行的日志调用,callstack将(可能)不同。一个例外是循环内的日志调用。但即使在这种情况下,也需要一些机制来帮助NLog甚至知道呼叫是从与前一个“相同的位置”进行的。这只能在(再次)在callstack处查看。

所以,总而言之,我认为NLog必须做到这一点:在每次进行日志调用时捕获callstack(虽然不是每个处理调用的布局/ appender) - 就像log4net一样,“警告“关于此选项是高性能日志调用的性能问题。

无论如何,您可能希望查看source,它也表示(虽然我没有在调试器中逐步执行),每个日志调用都会捕获一个callstack。

UPDATE 为了完整起见,从.NET 4.5开始,可以使用caller info attributes。他们有自己的“限制”,比如不包括typename。但是,NLog目前没有使用它们。

[1]除了可能在调试器中使用一些IL级重写或运行应用程序。