我试图理解的目的已启用 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(使用前将#替换为@)