即使IsEnabled返回false,也会调用ILogger(ASP.NET Core)日志

时间:2017-06-16 09:02:15

标签: asp.net-core

我试图理解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。

2 个答案:

答案 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