.net core 日志引擎 ILogger接口与使用

ILogger接口与使用

https://github.com/aspnet/Logging core 日志项目地址

1.配置IDE可调试core 源码

  • .net core源码都是开放的,配置的目的是为了调试的时候可以直接步进.core源码,方便查看框架内部实现方式。

.net core 日志引擎 ILogger接口与使用_第1张图片

 

.net core 日志引擎 ILogger接口与使用_第2张图片

 

  • 效果

.net core 日志引擎 ILogger接口与使用_第3张图片

 

2.日志记录器简单使用

2.1 配置日志提供器

.net core 日志引擎 ILogger接口与使用_第4张图片

 

2.2 注入需要记录日志的地方

.net core 日志引擎 ILogger接口与使用_第5张图片

 

2.3 运行结果

.net core 日志引擎 ILogger接口与使用_第6张图片

 

3. .net Core 日志三大接口探究

  • ILogger 日子记录器
  • ILoggerFactory 日志记录器工厂
  • ILoggerProvider 日志记录器提供器

他们的关系是 ILoggerFactory 根据日志类型(categoryName)调用 对应的 ILoggerProvider 获取 ILogger

3.1 探究ILoggerFactory 来源

  • IWebHostBuilder.Build() -> BuildCommonServices() -> AddLogging() 应用初始化的时候就把ILoggerFactory 托管给了DI,

     

    .net core 日志引擎 ILogger接口与使用_第7张图片

     

  • 所以可以在Start.Configure() 方法中直接注入ILoggerFactory(ps:这个方法非常特殊,这方法的参数可以无穷多个,但是每个参数都必须是DI托管的对象。)

     

    .net core 日志引擎 ILogger接口与使用_第8张图片

     

3.2 ILoggerProvider 重要也不重要,提供器主要的作用就是创建Logger。

.net core 日志引擎 ILogger接口与使用_第9张图片

 

3.3 Logger 主要干活的

3.3.1 探究注入到Controller的ILooger到底是哪个Logger?难道只是某一个提供器生成Logger对象?

.net core 日志引擎 ILogger接口与使用_第10张图片

 

  • 首先看看到底是哪个ILogger的托管到了容器里(Provider生成Logger对象并没有托管给容器,所以容器注入的Logger肯定不是日志提供器创建的ILogger对象)

  • 翻代码,在应用初始化的IWebHostBuilder.Build() -> BuildCommonServices() -> AddLogging() 中看到了

  • 这个泛型Logger<>的命名空间是:Microsoft.Extensions.Logging

.net core 日志引擎 ILogger接口与使用_第11张图片

 

  • 这个Logger<> 就非常有意思, 他的成员变量里有LoggerFactory和LoggerInformation[] 引用 !!!(LoggerInformation是Logger的包装类,主要增加了一些Logger的元数据,可以理解成这就是一个Logger,这个logger就是LoggerProvider创建的Logger)

.net core 日志引擎 ILogger接口与使用_第12张图片

 

3.3.2 从ILogger<>.LogWarning() 看Logger调用方式

  • 调用入口

     

    .net core 日志引擎 ILogger接口与使用_第13张图片

     

  • 泛型Logger<> 调用Logger

     

    .net core 日志引擎 ILogger接口与使用_第14张图片

     

  • Logger 循环调用所有注册的日志提供器生成的Logger

     

    .net core 日志引擎 ILogger接口与使用_第15张图片

     

4. 日志的各种使用

4.1 日志域

  • 日志作用域的目的就是想把日志分域(作用域),分组。好处就是方便日志筛选,统计,挖掘。比如可以吧单个业务操作的所有日志分到一个域里。
  • 如果是想把日志输出到ConsoleLogger上并分域,一定要开启分域功能

.net core 日志引擎 ILogger接口与使用_第16张图片

 

.net core 日志引擎 ILogger接口与使用_第17张图片

 

4.3 内置日志提供器

  • 控制台
  • 调试
  • EventSource
  • EventLog
  • TraceSource
  • Azure 应用服务

4.3.1 控制台提供程序

  • Microsoft.Extensions.Logging.Console 提供程序包
  • 向控制台发送日志输出。
  • loggerFactory.AddConsole();

     

    .net core 日志引擎 ILogger接口与使用_第18张图片

     

4.3.2 调试提供程序

  • Microsoft.Extensions.Logging.Debug 提供程序包
  • 使用 System.Diagnostics.Debug 类(Debug.WriteLine 方法调用)来写入日志输出。
    在 Linux 中,此提供程序将日志写入 /var/log/message。
  • loggerFactory.AddDebug();

     

    .net core 日志引擎 ILogger接口与使用_第19张图片

     

4.3.3 EventSource 提供程序

  • Microsoft.Extensions.Logging.EventSource 提供程序包
  • ASP.NET Core 1.1.0 或更高版本
  • 可实现事件跟踪。 在 Windows 中,它使用 ETW。 提供程序可跨平台使用,但尚无支持 Linux 或 macOS 的事件集合和显示工具。
  • 可使用 PerfView 实用工具收集和查看日志。
  • logging.AddEventSourceLogger();

     

    .net core 日志引擎 ILogger接口与使用_第20张图片

     

4.3.4 Windows EventLog 提供程序

  • Microsoft.Extensions.Logging.EventLog 提供程序包
  • 向 Windows 事件日志发送日志输出。
  • loggerFactory.AddEventLog();

     

    .net core 日志引擎 ILogger接口与使用_第21张图片

     

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类型的日志

 

.net core 日志引擎 ILogger接口与使用_第22张图片

 

 

.net core 日志引擎 ILogger接口与使用_第23张图片

 

 

.net core 日志引擎 ILogger接口与使用_第24张图片

 

4.3.7.4 提供程序别名

  • Console
  • Debug
  • EventLog
  • AzureAppServices
  • TraceSource
  • EventSource
  • 别名在日志筛选的时候需要用到

4.3.7.5 日志筛选配置

.net core 日志引擎 ILogger接口与使用_第25张图片

 

4.4 第三方日志记录提供程序

  • elmah.io(GitHub 存储库)

  • Gelf(GitHub 存储库)

  • JSNLog(GitHub 存储库)

  • KissLog.net(GitHub 存储库)

  • Loggr(GitHub 存储库)

  • NLog(GitHub 存储库)

  • Serilog(GitHub 存储库)

4.7 实现自己的文件日志提供程序

.net core 日志引擎 ILogger接口与使用_第26张图片

 

  • 注册提供器

     

    .net core 日志引擎 ILogger接口与使用_第27张图片

     

  • 运行效果

     

    .net core 日志引擎 ILogger接口与使用_第28张图片



作者:李浩的博客
链接:https://www.jianshu.com/p/cf31f2e5a4a4
来源:简书

你可能感兴趣的:(.net,core)