.NET Core 中的日志与分布式链路追踪( 二 )

[ Interceptor] publicclassHello{[ Log] publicvirtualvoidSayHello( stringcontent ) {varstr = $"Hello, {content}" ; Console.WriteLine(str);}}然后创建代理类型: staticvoidMain( string[] args ) {...

  • [ Interceptor] publicclassHello{[ Log] publicvirtualvoidSayHello( stringcontent ) {varstr = $"Hello, {content}" ; Console.WriteLine(str);}}然后创建代理类型:
    staticvoidMain( string[] args ) {Hello hello = AopInterceptor.CreateProxyOfClass<Hello>;hello.SayHello( "any one"); Console.Read;}启动程序 , 会输出:
    SayHello函数被执行前Hello,anyoneSayHello函数被执行后你完全不需要担心 AOP 框架会给你的程序带来性能问题 , 因为 CZGL.AOP 框架采用 EMIT 编写 , 并且自带缓存 , 当一个类型被代理过 , 之后无需重复生成 。
    CZGL.AOP 可以通过 .NET Core 自带的依赖注入框架和 Autofac 结合使用 , 自动代理 CI 容器中的服务 。 这样不需要 AopInterceptor.CreateProxyOfClass 手动调用代理接口 。
    CZGL.AOP 代码是开源的 , 可以参考笔者另一篇博文:
    Microsoft.Extensions.Logging
    有些公司无技术管理规范 , 不同的开发人员使用不同的日志框架 , 一个产品中可能有 .txt、NLog、Serilog等 , 并且没有同一的封装 。
    .NET Core 中的日志组件有很多 , 但是流行的日志框架基本都会实现 Microsoft.Extensions.Logging.Abstractions , 因此我们可以学习Microsoft.Extensions.Logging。 Microsoft.Extensions.Logging.Abstractions 是官方对日志组件的抽象 , 如果一个日志组件并不支持 Microsoft.Extensions.Logging.Abstractions 那么这个组件很容易跟项目糅合的 , 后续难以模块化以及降低耦合程度 。
    Microsoft.Extensions.Logging 软件包中包含 Logging API, 这些 Logging API 不能独立运行 。 它与一个或多个日志记录提供程序一起使用 , 这些日志记录提供程序将日志存储或显示到特定输出 , 例如 Console, Debug, TraceListeners 。
    下图是 .NET Core 中 Loggin API 的层次结构:
    .NET Core 中的日志与分布式链路追踪
    文章图片

    图片来源:https://www.tutorialsteacher.com/
    说实话 , Microsoft.Extensions.Logging 刚开始是学着很懵 , 配置感觉很复杂 。 因此 , 有一张清晰的结构图很重要 , 可以帮助大家理解里面的 Logging API 。
    ILoggerFactory

    .NET Core 中很多标准接口都实践了工厂模式的思想 , ILoggerFactory 正是工厂模式的接口 , 而 LoggerFactory 是工厂模式的实现 。
    其定义如下:
    publicinterfaceILoggerFactory: IDisposable{ILogger CreateLogger( stringcategoryName ) ; voidAddProvider( ILoggerProvider provider) ; }ILoggerFactory 工厂接口的作用是创建一个 ILogger 类型的实例 , 即 CreateLogger 接口 。
    ILoggerProvider

    通过实现ILoggerProvider接口可以创建自己的日志记录提供程序 , 表示可以创建 ILogger 实例的类型 。
    其定义如下:
    publicinterfaceILoggerProvider: IDisposable{ILogger CreateLogger( stringcategoryName ) ; }ILogger

    ILogger 接口提供了将日志记录到基础存储的方法 , 其定义如下:
    publicinterfaceILogger{voidLog<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter); boolIsEnabled( LogLevel logLevel) ; IDisposable BeginScope<TState>(TState state);}Logging Providers

    logging providers 称为日志记录程序 。
    Logging Providers 将日志显示或存储到特定介质 , 例如 console, debugging event, event log, trace listener 等 。
    Microsoft.Extensions.Logging 提供了以下类型的 logging providers , 我们可以通过 Nuget 获取 。

    特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。