3

.NET Core 日志模型

 2 years ago
source link: https://beckjin.com/2020/02/09/aspnet-log/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

.NET Core 日志模型

发表于 2020-02-09

| 分类于 .NET Core

| 阅读次数:

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

三大核心对象

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 接口的对象,包含 BeginScopeIsEnabledLog 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 包含 AddProviderCreateLogger 2 个方法,通过 AddProvider 注册 LoggerProvider 对象,通过 CreateLogger 创建指定名称的 Logger 对象。

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

三者之间的关系图如下:

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

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

如果对你有帮助就好

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK