重新整理 .net core 实践篇—————日志系统之结构化[十八] (3)

那么SerilogLogger 的_logger 到底是什么呢?我们可以看到其实这个_logger 是SerilogLoggerFactory到SerilogLoggerProvider到SerilogLogger一层一层传进去的,最后调用ForContext生成,上面可以看到具体各个的实例化函数。

如果我们不传的话,那么会默认使用 Serilog.Log.Logger,在SerilogLogger的实例化函数中这样写道:

Serilog.ILogger logger1 = this._logger; if (logger1 == null) logger1 = Serilog.Log.Logger.ForContext((IEnumerable<ILogEventEnricher>) new SerilogLoggerProvider[1] { provider }); this._logger = logger1;

而在UseSerilog中logger参数的参数介绍中也写道: The Serilog logger; if not supplied, the static will be used.

之所以重点谈论这个_logger 这个数据,是为了引出Serilog.Log.Logger这个东西,是不是感觉特别眼熟?我们在Startup的ConfigureServices中写道:

services.AddLogSeriLog(Configuration);

AddLogSeriLog 为:

public static Serilog.ILogger AddLogSeriLog(this IServiceCollection services, IConfiguration configuration) { Log.Logger = new LoggerConfiguration().ReadFrom.Configuration(configuration) .MinimumLevel.Debug() .Enrich.FromLogContext() .WriteTo.Console(new RenderedCompactJsonFormatter()) .WriteTo.File(formatter: new CompactJsonFormatter(), "logs\\test.txt", rollingInterval: RollingInterval.Day) .CreateLogger(); return Log.Logger; }

这里我们就生成了具体打印实现类的管理类,是代理模式哈。大体就是各个不同的实现类继承ILogEventSink,然后SafeAggregateSink也继承自ILogEventSink,SafeAggregateSink里面有个属性readonly ILogEventSink[] _sinks,然后调用Serilog的 Logger

类调用write方法会调用SafeAggregateSink的Emit。

SafeAggregateSink类如下,主要看下Emit方法:

class SafeAggregateSink : ILogEventSink { readonly ILogEventSink[] _sinks; public SafeAggregateSink(IEnumerable<ILogEventSink> sinks) { if (sinks == null) throw new ArgumentNullException(nameof(sinks)); _sinks = sinks.ToArray(); } public void Emit(LogEvent logEvent) { foreach (var sink in _sinks) { try { // 调用不同的Log打印的实现类 如文件、控制台 等 sink.Emit(logEvent); } catch (Exception ex) { SelfLog.WriteLine("Caught exception while emitting to sink {0}: {1}", sink, ex); } } } }

具体就不细写了,里面都是一些格式匹配的,根据我们上面的分析,其实我们应该知道先看CreateLogger这个函数哈,然后去看Console这个函数。如对格式化感兴趣可

以去看下哈,里面又套了一层代理模式的娃。

上述只是个人整理,如有错误,望请指出,谢谢。

下一次 中间件。 前面其实写个中间件的一些基本概念,介绍其实中间件就是职责链模式,所以下一节主要整理一下具体实践。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgfwxg.html