ILogger (ASP.NET Core) 日志被调用甚至 IsEnabled 返回 false

2024-03-25

我试图理解的目的已启用 https://learn.microsoft.com/en-us/aspnet/core/api/microsoft.extensions.logging.ilogger#Microsoft_Extensions_Logging_ILogger_IsEnabled_Microsoft_Extensions_Logging_LogLevel_ILogger 接口中的方法。 我希望每次可以记录某些内容时都会自动调用该方法,但是无论返回 IsEnabled 是什么,都会调用 Log 方法。

我应该在 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。


IsEnabled当您传递参数时尤其重要。

没有启用

logger.LogDebug("My debug message with {payload}", Serialize(myPayload));

在这种情况下,myPayload 在每次调用时都会被序列化LogDebug无论您的日志级别设置如何。这可能在生产环境中造成不必要的影响,并可能导致意外错误。如果 Serialize 方法由于意外数据而失败怎么办?

使用 IsEnabled

if (logger.IsEnabled(LogLevel.Debug))
{
    logger.LogDebug("My debug message with {payload}", Serialize(myPayload));
}

在这种情况下,myPayload 仅在以下情况下被序列化:LogDebug已在您的设置中启用。

平衡的方法

就我个人而言,我会跳过IsEnabled检查对 Log() 方法的“常量文本”调用(例如,logger.LogDebug("constant string")),并且仅测试IsEnabled当我需要使用参数登录时。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ILogger (ASP.NET Core) 日志被调用甚至 IsEnabled 返回 false 的相关文章

随机推荐