.NET Core 日志模型
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.
.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
对象来记录日志,点击查看源码 。
三者之间的关系图如下:
在 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 条日志:
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK