为什么 IsEnabled 是 ILogger 接口的一部分?

Why is IsEnabled part of the ILogger Interface?

ILogger 接口有一个必需的方法IsEnabled。我正在努力理解界面中该方法的用途。 (重要说明:我不关心实现 class,只是接口。)

.Net Core 正常记录时好像没有调用。

这个似乎表明它是供开发人员在决定登录时使用的。

但这没有意义。作为开发人员,我可以在实现 ILogger 接口的 class 中创建我需要的任何方法,以决定是否要记录。如果实现接口的 class 不需要提供 IsEnabled,则强制所有实现者都实现它是没有意义的。

ILogger 界面中 IsEnabled 的用途是什么?

有时计算传递的某些参数的成本可能很高。因此,调用者可以根据需要过滤掉工作:

if (logger.IsEnabled(LogLevel.Debug))
{
     logger.LogDebug("The message: {value}", DoSomethingCostlyHere());
}

另一种常见模式是将更多详细信息(例如 PII 或其他敏感数据)放入不会在生产中显示的调试消息中:

if (logger.IsEnabled(LogLevel.Debug))
{
     logger.LogDebug("'{username}' logged in", username);
}
else 
{
     logger.LogInformation("User logged in");
}

其他日志框架也有这个:NLog, Serilog, log4net,等等