记录各种级别的日志是所有应用不可或缺的功能。关于日志记录的实现,我们有太多第三方框架可供选择,比如Log4Net、NLog、Loggr和Serilog 等,当然我们还可以选择微软原生的诊断机制(相关API定义在命名空间“System.Diagnostics”中)实现对日志的记录。.NET Core提供了独立的日志模型使我们可以采用统一的API来完成针对日志记录的编程,我们同时也可以利用其扩展点对这个模型进行定制,比如可以将上述这些成熟的日志框架整合到我们的应用中。本系列文章旨在从设计和实现的角度对.NET Core提供的日志模型进行深入剖析,不过在这之前我们必须对由它提供的日志记录编程模式具有一个大体的认识,接下来我们会采用实例的形式来演示如何相应等级的日志并最终将其写入到我们期望的目的地中。

目录
一、日志模型三要素
二、将日志写入不同的目的地
三、依赖注入
四、根据等级过滤日志消息
五、利用TraceSource记录日志
    直接利用TraceSource记录追踪日志
    利用TraceSourceLoggerProvider记录追踪日志

 

.NET Core下的日志(1):记录日志信息日志记录编程主要会涉及到三个核心对象,它们分别是LoggerLoggerFactoryLoggerProvider,这三个对象同时也是.NET Core日志模型中的核心对象,并通过相应的接口(ILogger、ILoggerFactory和ILoggerProvider)来体现。右图所示的UML揭示了日志模型的这三个核心对象之间的关系。

在进行日志记录编程时,我们直接调用Logger对象相应的方法写入日志,LoggerFactory是创建Logger对象的工厂。由LoggerFactory创建的Logger并不真正实现对日志的写入操作,真正将日志写入相应目的地的Logger是通过相应的LoggerProvider提供的,前者是对后者的封装,它将日志记录请求委托给后者来完成。

具体来说,在通过LoggerFactory创建Logger之前,我们会根据需求将一个或者多个LoggerProvider注册到LoggerFactory之上。比如,如果我们需要将日志记录到EventLog中,我们会注册一个EventLogLoggerProvider,后者会提供一个EventLogLogger对象来实现针对EventLog的日志记录。当我们利用LoggerFactory创建Logger对象时,它会利用注册其上的所有LoggerProvider创建一组具有真正日志写入功能的Logger对象,并采用“组合(Composition)”模式利用这个Logger列表创建并返回一个Logger对象。

综上所述,LoggerFactory创建的Logger仅仅是一个“壳”,在它内部封装了一个或者多个具有真正日志写入功能的Logger对象。当我们调用前者实施日志记录操作时,它会遍历被封装的Logger对象列表,并委托它们将日志写入到相应的目的地。

二、将日志写入不同的目的地

接下来我们通过一个简单的实例来演示如何将具有不同等级的日志写入两种不同的目的地,其中一种是直接将格式化的日志消息输出到当前控制台,另一种则是将日志写入Debug输出窗口(相当于直接调用Debug.WriteLine方法),针对这两种日志目的地的Logger分别通过ConsoleLoggerProvider和DebugLoggerProvider来提供。

我们创建一个空的.NET Core控制台应用,并在其project.json文件中添加如下三个NuGet包的依赖,其中默认使用的LoggerFactory和由它创建的Logger定义在“Microsoft.Extensions.Logging”之中,而上述的ConsoleLoggerProvider和DebugLoggerProvider则分别由其余两个NuGet包来提供。由于在默认情况下 ,.NET Core并不支持中文编码,我们需要显式注册一个名为的针对相应的EncodingProvider,后者定义在NuGet包 “System.Text.Encoding.CodePages”之中,所以我们需要添加这个这NuGet包的依赖。

   1: {
   2:   
: {
   4:     ...
,
,
,
   8:  
  10:   },
  11:   ...
  12: }

相关文章: