.net 当涉及到性能考虑时,日志记录筛选器在内部是如何工作的?

34gzjxbg  于 2023-01-10  发布在  .NET
关注(0)|答案(1)|浏览(113)

假设我们在appsetting.json中有一个LogLevel为“debug”的类别名称,下面是源代码行

_logger.LogDebug("SubjectId is {Id}", id);

假设应用程序处于生产状态,我们将日志级别从“调试”变为“信息”。
但是这段源代码仍然存在于源代码中,日志记录语句仍然会先执行,然后以某种方式将日志记录过滤掉。这是不是非常低效,因为它仍然需要一个方法调用?我们可以使用一些高级运行时技术,让CLR运行时根本不调用此方法,从而根本不调用_logger.LogDebug("SubjectId is {Id}", id);
或者当前的日志设计已经使用了某种技术来实现我上面描述的内容?

aiazj4mn

aiazj4mn1#

正如在评论中提到的,要做到这一点可能对系统的性能有很高的要求,很有可能你有一些其他的方法调用,与数据库通信,调用外部系统等,这将花费比简单的日志调用长得多的时间,首先要优化这些。
您可以做的是检查是否启用了调试日志记录,然后仅在这种情况下调用LogDebug方法:

if (_logger.IsEnabled(LogLevel.Debug))
    _logger.LogDebug("SubjectId is {Id}", id);

对于一个或几个方法来说,这很好用,但是如果您需要在多个日志语句前面使用if,那么编写起来很快就会变得很乏味。
. NET 5和更新版本支持源代码生成器,可以用来为您生成日志代码(包括if)。这是我找到的关于这个主题的最好的帖子:Improving logging performance with source generators.

相关问题