ASP.NET Core 日志模型
.NET Core 提供了独立的日志模型,采用统一的 API 来完成日志的记录,支持各种内置日志记录器(如:Console、Debug、EventSource、EventLog、TraceSource 等 )和第三方日志框架 (如: Log4Net、NLog、Loggr、Serilog、Sentry 等),同时基于日志模型的扩展性,也可自定义更多的日志记录器。
三大核心对象
Logger
public interface ILogger
{
IDisposable BeginScope<TState>(TState state);
bool IsEnabled(LogLevel logLevel);
void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter);
}
Logger
是实现 ILogger
接口的对象,包含 BeginScope
、IsEnabled
、Log
3 个方法,通过 IsEnabled
方法判断当前 Logger
是否支持指定的日志等级,如果不支持则会忽略这条日志。BeginScope
主要是方便日志追踪使用,通过 BeginScope
可定义一个区间范围内的日志统一标识。
LoggerProvider
public interface ILoggerProvider : IDisposable
{
ILogger CreateLogger(string categoryName);
}
LoggerProvider
是实现 ILoggerProvider
接口的对象,日志写入目的地的最终实现者。LoggerProvider
只含 CreateLogger
方法,该方法返回当前 Provider 的具体 Logger
对象。
LoggerFactory
public interface ILoggerFactory : IDisposable
{
void AddProvider(ILoggerProvider provider);
ILogger CreateLogger(string categoryName);
}
LoggerFactory
是实现 ILoggerFactory
接口的对象,LoggerFactory
包含 AddProvider
和 CreateLogger
2 个方法,通过 AddProvider
注册 LoggerProvider
对象,通过 CreateLogger
创建指定名称的 Logger
对象。
关于 LoggerFactory
中提供的创建 Logger
的方法和 LoggerProvider
中提供的创建 Logger
的方法是不一样的,LoggerFactory
创建的 Logger
对象主要是日志记录统一入口,实际最终是委托 LoggerProvider
创建的 Logger
对象来记录日志,如果 LoggerFactory
中注册了多个 LoggerProvider
,那就分别会调用其 Logger
对象来记录日志,点击查看源码 。
三者之间的关系图如下:
relation日志等级
在 Logger
对象的 Log
方法中必须传入日志等级参数 LogLevel
,所以每条记录的日志都必须有日志等级标记。具体枚举值如下:
public enum LogLevel
{
Trace = 0,
Debug = 1,
Information = 2,
Warning = 3,
Error = 4,
Critical = 5,
None = 6
}
枚举值决定等级高低,值越大,等级越高,等级越高,重要程度越大。比如在程序开发中,有的日志只是为了记录执行过程,方便后续分析判断,有的日志是记录程序异常,一般需要及时处理,这时就需要通过日志等级来做一些区分。同时日志等级可以方便 LoggerProvider
对日志进行过滤,比如某些 LoggerProvider
只关注日志级别是 Error
以上,就可以通过指定 LogLevel
来限定。
代码示例
static void Main(string[] args)
{
ILogger logger = new LoggerFactory()
.AddConsole(LogLevel.Warning)
.AddDebug()
.CreateLogger(nameof(Program));
logger.LogInformation("Information 日志");
logger.LogWarning("Warning 日志");
logger.LogError("Error 日志");
Console.ReadKey();
}
向 LoggerFactory
注册了 Console
和 Debug
2个内置的 LogProvider
(之后将有文章介绍部分第三方日志框架的使用),同时指定 ConsoleProvider
过滤的日志等级必须是 Warning
及更高。
结果如下,控制台输出 2 条日志,调试窗口输出 3 条日志:
result