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

Asp.net core ILogger(ASP.NET Core)日志被调用,甚至IsEnabled返回false,asp.net-core,Asp.net Core,我试图理解ILogger接口中方法的用途。 我希望每次可以记录某些内容时都会自动调用该方法,但无论返回的内容是什么,都会调用方法日志 我应该在日志方法中检查IsEnabled吗 public bool IsEnabled(LogLevel logLevel) { return logLevel >= this.level; } public void Log<TState>(LogLevel logLevel, EventId

我试图理解ILogger接口中方法的用途。 我希望每次可以记录某些内容时都会自动调用该方法,但无论返回的内容是什么,都会调用方法日志

我应该在日志方法中检查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));
        }
    }
public bool已启用(日志级别日志级别)
{
返回logLevel>=此.level;
}
公共无效日志(日志级别、日志级别、事件ID、事件ID、TState状态、异常、函数格式化程序)
{
if(this.IsEnabled(logLevel))//这是必需的吗????
{
字符串s=格式化程序(状态,异常);
字符串格式=s.Replace(“\r\n”,“\r\n”);
WriteLine(string.Format(“{0,-15}{1,-5}-{2}”,logLevel,eventId,formatted));
}
}

那么目的是什么,以及谁(为什么)调用IsEnabled。

除非Microsoft更改它,否则您应该自己调用IsEnabled

原因是,如果API调用IsEnabled,然后用户的代码调用IsEnabled,那么每个日志操作的调用量将增加一倍,对性能的影响将超过最终的帮助

此外,日志框架在向日志接收器写入内容之前,将始终尊重过滤器和最小日志级别。也就是说,如果您总是调用
LogDebug
,并且
Information
是您配置的最低日志级别,那么调试消息将不会出现在日志中

但是!如果不检查
logger.IsEnabled(LogLevel.Debug)
并仅在必要时运行代码,则调用
LogDebug
和筛选的代码将被删除


希望这是有意义的

IsEnabled
在传递参数时尤其重要

未启用

logger.LogDebug("My debug message with {payload}", Serialize(myPayload));
if (logger.IsEnabled(LogLevel.Debug))
{
    logger.LogDebug("My debug message with {payload}", Serialize(myPayload));
}
在这种情况下,无论您的日志级别设置如何,每次调用
LogDebug
,myPayload都会被序列化。这在生产环境中可能是不必要的打击,并可能导致意外错误。如果序列化方法由于意外数据而失败怎么办

已启用

logger.LogDebug("My debug message with {payload}", Serialize(myPayload));
if (logger.IsEnabled(LogLevel.Debug))
{
    logger.LogDebug("My debug message with {payload}", Serialize(myPayload));
}
在这种情况下,只有在您的设置中启用了
LogDebug
时,才会序列化myPayload

平衡方法


就我个人而言,我跳过了对Log()方法(例如,
logger.LogDebug(“常量字符串”)
)的“常量文本”调用的
IsEnabled
检查,只有在我需要使用参数登录时才测试
IsEnabled

我知道这是一个旧答案,但是我觉得有必要评论一下,让
ILogger
接口强制创建一个
IsEnabled
方法似乎很奇怪,因为它不希望被调用(如果您愿意,除了您自己的代码)。为什么它是界面的一部分?如果我需要一个
IsEnabled
方法,我可以创建一个,即使它不是接口的一部分。(似乎没有理由认为,
IsEnabled
ILogger
界面的一部分。)