ASP.NET Core 日志模型

.NET Core 提供了独立的日志模型,采用统一的 API 来完成日志的记录,支持各种内置日志记录器(如:Console、Debug、EventSource、EventLog、TraceSource 等 )和第三方日志框架 (如: Log4NetNLogLoggrSerilogSentry 等),同时基于日志模型的扩展性,也可自定义更多的日志记录器。

三大核心对象

Logger

1
2
3
4
5
6
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 接口的对象,包含 BeginScopeIsEnabledLog 3 个方法,通过 IsEnabled 方法判断当前 Logger 是否支持指定的日志等级,如果不支持则会忽略这条日志。BeginScope 主要是方便日志追踪使用,通过 BeginScope 可定义一个区间范围内的日志统一标识。

LoggerProvider

1
2
3
4
public interface ILoggerProvider : IDisposable
{
ILogger CreateLogger(string categoryName);
}

LoggerProvider 是实现 ILoggerProvider 接口的对象,日志写入目的地的最终实现者。LoggerProvider 只含 CreateLogger 方法,该方法返回当前 Provider 的具体 Logger 对象。

LoggerFactory

1
2
3
4
5
public interface ILoggerFactory : IDisposable
{
void AddProvider(ILoggerProvider provider);
ILogger CreateLogger(string categoryName);
}

LoggerFactory 是实现 ILoggerFactory 接口的对象,LoggerFactory 包含 AddProviderCreateLogger 2 个方法,通过 AddProvider 注册 LoggerProvider 对象,通过 CreateLogger 创建指定名称的 Logger 对象。

关于 LoggerFactory 中提供的创建 Logger 的方法和 LoggerProvider 中提供的创建 Logger 的方法是不一样的,LoggerFactory 创建的 Logger 对象主要是日志记录统一入口,实际最终是委托 LoggerProvider 创建的 Logger 对象来记录日志,如果 LoggerFactory 中注册了多个 LoggerProvider,那就分别会调用其 Logger 对象来记录日志,点击查看源码

三者之间的关系图如下:

relation

日志等级

Logger 对象的 Log 方法中必须传入日志等级参数 LogLevel,所以每条记录的日志都必须有日志等级标记。具体枚举值如下:

1
2
3
4
5
6
7
8
9
10
public enum LogLevel
{
Trace = 0,
Debug = 1,
Information = 2,
Warning = 3,
Error = 4,
Critical = 5,
None = 6
}

枚举值决定等级高低,值越大,等级越高,等级越高,重要程度越大。比如在程序开发中,有的日志只是为了记录执行过程,方便后续分析判断,有的日志是记录程序异常,一般需要及时处理,这时就需要通过日志等级来做一些区分。同时日志等级可以方便 LoggerProvider 对日志进行过滤,比如某些 LoggerProvider 只关注日志级别是 Error 以上,就可以通过指定 LogLevel 来限定。

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
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 注册了 ConsoleDebug 2个内置的 LogProvider之后将有文章介绍部分第三方日志框架的使用),同时指定 ConsoleProvider 过滤的日志等级必须是 Warning 及更高。

结果如下,控制台输出 2 条日志,调试窗口输出 3 条日志:

result

参考链接

如果对你有帮助就好