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

Vac*_*ano 2 c# interface .net-core asp.net-core

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

.Net Core 在正常日志记录期间似乎不会调用它。

这个答案似乎表明开发人员在决定登录时可以使用它。

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

接口IsEnabled中的is 的目的是ILogger什么?

Dan*_*ite 5

有时计算一些传递的参数可能会很昂贵。因此,调用者可以根据需要过滤掉工作:

if (logger.IsEnabled(LogLevel.Debug))
{
     logger.LogDebug("The message: {value}", DoSomethingCostlyHere());
}
Run Code Online (Sandbox Code Playgroud)

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

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

其他日志框架也有这个:NLogSeriloglog4net等。