Asp.net core ILogger(ASP.NET Core)日志被调用,甚至IsEnabled返回false
我试图理解ILogger接口中方法的用途。 我希望每次可以记录某些内容时都会自动调用该方法,但无论返回的内容是什么,都会调用方法日志 我应该在日志方法中检查IsEnabled吗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
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
界面的一部分。)