【问题标题】:Performance Implications of Callsite Layout Renderer in NLogNLog 中调用站点布局渲染器的性能影响
【发布时间】:2012-09-03 10:44:10
【问题描述】:

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

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

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

【问题讨论】:

标签: .net performance nlog


【解决方案1】:

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

所以,总而言之,我认为 NLog 必须完全做到这一点:在每次进行日志调用时捕获调用堆栈(尽管不是针对处理调用的每个布局/附加程序) - 就像 log4net 顺便说一句,“警告”关于此选项是一个高频率日志调用的性能问题。

无论如何,您可能想查看source,它还表明(尽管我没有在调试器中单步执行)每个日志调用都会捕获一个调用堆栈。

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

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

【讨论】:

  • 感谢您提供的信息。您还知道每次日志调用获取一个堆栈跟踪对性能的影响吗?
  • 每个日志调用都会比没有调用慢?!? ;-) 说真的,当然它会更慢,你知道的。无法告知确切的数字,因为这取决于您的应用程序(每秒多少次日志调用,甚至可能是堆栈深度等)。
猜你喜欢
  • 1970-01-01
  • 2018-11-10
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多