ILogger接口与使用
https://github.com/aspnet/Logging core 日志项目地址
1.配置IDE可调试core 源码
- .net core源码都是开放的,配置的目的是为了调试的时候可以直接步进.core源码,方便查看框架内部实现方式。
- 效果
2.日志记录器简单使用
2.1 配置日志提供器
2.2 注入需要记录日志的地方
2.3 运行结果
3. .net Core 日志三大接口探究
- ILogger 日子记录器
- ILoggerFactory 日志记录器工厂
- ILoggerProvider 日志记录器提供器
他们的关系是 ILoggerFactory 根据日志类型(categoryName)调用 对应的 ILoggerProvider 获取 ILogger
3.1 探究ILoggerFactory 来源
-
IWebHostBuilder.Build() -> BuildCommonServices() -> AddLogging() 应用初始化的时候就把ILoggerFactory 托管给了DI,
-
所以可以在Start.Configure() 方法中直接注入ILoggerFactory(ps:这个方法非常特殊,这方法的参数可以无穷多个,但是每个参数都必须是DI托管的对象。)
3.2 ILoggerProvider 重要也不重要,提供器主要的作用就是创建Logger。
3.3 Logger 主要干活的
3.3.1 探究注入到Controller的ILooger到底是哪个Logger?难道只是某一个提供器生成Logger对象?
首先看看到底是哪个ILogger的托管到了容器里(Provider生成Logger对象并没有托管给容器,所以容器注入的Logger肯定不是日志提供器创建的ILogger对象)
翻代码,在应用初始化的IWebHostBuilder.Build() -> BuildCommonServices() -> AddLogging() 中看到了
这个泛型Logger<>的命名空间是:Microsoft.Extensions.Logging
- 这个Logger<> 就非常有意思, 他的成员变量里有LoggerFactory和LoggerInformation[] 引用 !!!(LoggerInformation是Logger的包装类,主要增加了一些Logger的元数据,可以理解成这就是一个Logger,这个logger就是LoggerProvider创建的Logger)
3.3.2 从ILogger<>.LogWarning() 看Logger调用方式
-
调用入口
-
泛型Logger<> 调用Logger
-
Logger 循环调用所有注册的日志提供器生成的Logger
4. 日志的各种使用
4.1 日志域
- 日志作用域的目的就是想把日志分域(作用域),分组。好处就是方便日志筛选,统计,挖掘。比如可以吧单个业务操作的所有日志分到一个域里。
- 如果是想把日志输出到ConsoleLogger上并分域,一定要开启分域功能
4.3 内置日志提供器
- 控制台
- 调试
- EventSource
- EventLog
- TraceSource
- Azure 应用服务
4.3.1 控制台提供程序
- Microsoft.Extensions.Logging.Console 提供程序包
- 向控制台发送日志输出。
-
loggerFactory.AddConsole();
4.3.2 调试提供程序
- Microsoft.Extensions.Logging.Debug 提供程序包
- 使用 System.Diagnostics.Debug 类(Debug.WriteLine 方法调用)来写入日志输出。
在 Linux 中,此提供程序将日志写入 /var/log/message。 -
loggerFactory.AddDebug();
4.3.3 EventSource 提供程序
- Microsoft.Extensions.Logging.EventSource 提供程序包
- ASP.NET Core 1.1.0 或更高版本
- 可实现事件跟踪。 在 Windows 中,它使用 ETW。 提供程序可跨平台使用,但尚无支持 Linux 或 macOS 的事件集合和显示工具。
- 可使用 PerfView 实用工具收集和查看日志。
-
logging.AddEventSourceLogger();
4.3.4 Windows EventLog 提供程序
- Microsoft.Extensions.Logging.EventLog 提供程序包
- 向 Windows 事件日志发送日志输出。
-
loggerFactory.AddEventLog();
4.3.5 TraceSource 提供程序
- Microsoft.Extensions.Logging.TraceSource 提供程序包
- loggerFactory.AddTraceSource();
4.3.6 Azure 应用服务提供程序
- Microsoft.Extensions.Logging.AzureAppServices 提供程序包
- ASP.NET Core 1.1.0 或更高版本
- 将日志写入 Azure App Service 应用的文件系统,以及 Azure 存储帐户中的 blob 存储。
- loggerFactory.AddAzureWebAppDiagnostics();
4.3.7 日志等级和日志筛选
- 最低级别以下的日志不会传递给提供程序,因此不会显示或存储它们。
- LogLevel.None 等级最高
- LogLevel.Trace 等级最低
- 日志等级就是用来做日志筛选
4.3.7.1 等级种类
- Trace = 0
- Debug = 1
- Information = 2
- Warning = 3
- Error = 4
- Critical = 5
- None = 6
4.3.7.2 按严重性从低到高排列
跟踪Trace = 0 表示仅对于开发人员调试问题有价值的信息。 这些消息可能包含敏感应用程序数据,因此不得在生产环境中启用它们。 默认情况下禁用。
调试Debug = 1 表示在开发和调试过程中短期有用的信息。除非要排查问题,否则通常不会在生产中启用
Debug
级别日志,因为日志数量过多。信息Information = 2 用于跟踪应用程序的常规流。 这些日志通常有长期价值。
警告Warning = 3 表示应用程序流中的异常或意外事件。 可能包括不会中断应用程序运行但仍需调查的错误或其他条件。
Warning
日志级别常用于已处理的异常。错误Error = 4 表示无法处理的错误和异常。 这些消息指示的是当前活动或操作(如当前 HTTP 请求)中的失败,而不是应用程序范围的失败。
严重Critical = 5 需要立即关注的失败。 例如数据丢失、磁盘空间不足。
None = 6 是禁用所有日志,因为没有比None更高的等级
4.3.7.3 举例
如果我等级配置成Error,那么就只会显示 Error和Critical类型的日志
4.3.7.4 提供程序别名
- Console
- Debug
- EventLog
- AzureAppServices
- TraceSource
- EventSource
- 别名在日志筛选的时候需要用到
4.3.7.5 日志筛选配置
4.4 第三方日志记录提供程序
4.7 实现自己的文件日志提供程序
-
注册提供器
-
运行效果