假设我们在appsetting.json中有一个LogLevel为“debug”的类别名称,下面是源代码行
_logger.LogDebug("SubjectId is {Id}", id);
假设应用程序处于生产状态,我们将日志级别从“调试”变为“信息”。
但是这段源代码仍然存在于源代码中,日志记录语句仍然会先执行,然后以某种方式将日志记录过滤掉。这是不是非常低效,因为它仍然需要一个方法调用?我们可以使用一些高级运行时技术,让CLR运行时根本不调用此方法,从而根本不调用_logger.LogDebug("SubjectId is {Id}", id);
?
或者当前的日志设计已经使用了某种技术来实现我上面描述的内容?
1条答案
按热度按时间aiazj4mn1#
正如在评论中提到的,要做到这一点可能对系统的性能有很高的要求,很有可能你有一些其他的方法调用,与数据库通信,调用外部系统等,这将花费比简单的日志调用长得多的时间,首先要优化这些。
您可以做的是检查是否启用了调试日志记录,然后仅在这种情况下调用
LogDebug
方法:对于一个或几个方法来说,这很好用,但是如果您需要在多个日志语句前面使用
if
,那么编写起来很快就会变得很乏味。. NET 5和更新版本支持源代码生成器,可以用来为您生成日志代码(包括
if
)。这是我找到的关于这个主题的最好的帖子:Improving logging performance with source generators.