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