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

标签 .net performance nlog

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

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

我想知道情况是否如此,或者 NLog 的优化是否超出了在每个日志记录调用上创建新的堆栈跟踪的范围,以及在写入大量日志条目的应用程序中对性能有何影响?

最佳答案

.NET 框架没有提供比使用 StackTrace 类更多的选项 [1] 来获取堆栈跟踪,无论是直接使用还是通过 Exception Environment.StackTrace 作为一个字符串,所以 NLog 能做的就很少了。此外,对于每个日志调用,调用堆栈(可能)会有所不同。一个异常(exception)是循环内的日志调用。但即使在这种情况下,也需要一些机制来帮助 NLog 知道该调用是从与前一个调用“相同的位置”发出的。这只能通过(再次)查看调用堆栈来确定。

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

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

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

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

关于.net - NLog 中 Callsite 布局渲染器的性能影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12246283/

相关文章:

使用 Selenium2 进行性能测试 Knockout、Angular 和 Backbone - Paul Hammant 的博客

javascript - 使用 for..in 循环访问 JSON 数据

c# - 有没有办法用 NLog 创建命名记录器并按此名称过滤日志记录?

c# - 如何防止 ${aspnet-request-posted-body} 不记录敏感信息

c# - 我如何告诉我的控制台应用程序在我输入数字之前不要继续?

c# - 如何在 HTMLGenericControl 上注册服务器端点击?

c# - MVC4 View 未绑定(bind)到 POST Controller 中的模型

没有 Blazor 的 C# WASM

java - 如何验证一个算法的运行时间?

asp.net-core - Azure 中使用 NLog 和 MS SQLServer 进行 ASP.NET Core 日志记录