我试图理解ILogger接口中IsEnabled方法的目的。 我希望每次有东西可以记录时自动调用该方法,但是方法Log被称为no mater返回IsEnabled。
我应该在Log方法中检查IsEnabled吗?
public bool IsEnabled(LogLevel logLevel)
{
return logLevel >= this.level;
}
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
{
if (this.IsEnabled(logLevel)) //it seams that this is required ????
{
string s = formatter(state, exception);
string formatted = s.Replace("\r\n", "\r\n ");
Console.WriteLine(string.Format("{0,-15} {1,-5} - {2}", logLevel, eventId, formatted));
}
}
然后是什么目的以及谁(为什么)调用IsEnabled。
答案 0 :(得分:1)
除非微软改变它,否则你应该自己打电话给IsEnabled
。
原因是,如果API会调用IsEnabled,然后用户的代码调用IsEnabled,那么每次日志操作的调用会加倍,并且性能会超过最终的帮助。
此外,在将内容写入日志接收器之前,日志记录框架始终会遵循过滤器和最小日志级别。这意味着,如果您总是调用LogDebug
并且Information
是您配置的最小日志级别,则调试消息将不会出现在日志中。
但是!如果您不检查LogDebug
并仅在必要时运行代码,则调用logger.IsEnabled(LogLevel.Debug)
和过滤的代码会被激活。
希望有意义
答案 1 :(得分:1)
IsEnabled
在传递参数时尤其重要。
未启用
logger.LogDebug("My debug message with {payload}", Serialize(myPayload));
在这种情况下,无论您的日志级别设置如何,每次调用LogDebug
都会对myPayload进行序列化。这在生产环境中可能是不必要的打击,并可能导致意外错误。如果序列化方法由于意外数据而失败怎么办?
已启用Is
if (logger.IsEnabled(LogLevel.Debug))
{
logger.LogDebug("My debug message with {payload}", Serialize(myPayload));
}
在这种情况下,只有在您的设置中启用LogDebug
时,myPayload才会被序列化。
平衡方法
就我个人而言,我跳过对Log()方法(例如IsEnabled
)进行“常量文本”调用的logger.LogDebug("constant string")
检查,仅在需要使用参数登录时才测试IsEnabled
。