• Asp.net core logging 日志


    1 基本概念

        Dotnet core 一个重要的特征是 Dependency injection ,中文一般是依赖注入,可以简单理解为一个集合,在应用程序启动时,定义各种具体的实现类型并将其放到集合中;在应用程序运行时,从集合中取出之前放入的类型。

        Logging 的实现就采用这种方式,写日志分为两步:创建写日志的对象;用创建的对象写日志。ILoggerProvider 创建写日志的对象 ILogger ,即在应用程序启动时,把实现了 ILoggerProvider 接口的类型放到集合中,在应用程序运行期间,需要写日志,先去集合中取 ILoggerProvider ,使用其创建 ILogger 对象,然后就可以写日志了。

    1.1 ILogger

        写日志的定义:

            void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter);

        除了 logLevel 有点熟,其它都感觉无用,只是我们并没有直接使用,并不是其真的无用。

    1.2 ILoggerProvider

    创建写日志对接定义:

            ILogger CreateLogger(string categoryName);

        通过定义可以知道,所有的 ILogger 对象都有 categoryName 属性。属性值不能为 Null。

        到这里其实可以写日志了,也仅只是写日志而已,还有两个比较重要的问题:1 写的日志在哪里可以看?2 如何管理写日志?

        问题1 是由 ILoggerProvider 接口的实现来决定,官方的实现有:Console 、Debug 、EventSource 、EventLog 、TraceSource 、Azure App Service,还有一些第三方实现,如此我们自己也是可以实现的。

        例如 ConsoleLoggerProvider 是将日志在命令行中打印出来,如果是控制台程序或者是 self host 启动 web 程序便可以在命令行中看到打印的日志信息。

        问题2由 log Level、EventId、Logger Provider、Log filtering、Log category、Log scopes 合作解决。好像是很复杂,其实比较简单。

    1.3 Log Level

        定义如下,数值越大级别越高。:

    Trace = 0

    Debug = 1

    Information = 2

    Warning = 3

    Error = 4

    Critical = 5

    None = 6

        例如:

    _logger.LogWarning(LoggingEvents.GetItemNotFound, "GetById({ID}) NOT FOUND", id);

        日志的 logLevel 是 Warning ,eventId 是的 GetItemNotFound,内容是“GetById({ID}) NOT FOUND”,这个对应接口定义中 formatter 的返回值 string。

    2 log filtering 说明

        为了说明日志过滤,先说明下日志的整体框架,在应用程序启动时,可以注册多个不同的 ILoggerProvider 实现,而在写日志时,只调用一次写,但所有注册的 ILoggerProvider 都能收到写的日志,这背后是由框架实现的。具体的简单点说,我们调用 log()后,它再遍历所有注册的 ILoggerProvider ,再分别调用它们的 log()方法。

        这样在一个正常的系统中会有多个 ILoggerProvider 实现,而每个 ILoggerProvider 创建的 ILogger 又有一个类别 category;也就是说在调用log()写日志时,ILogger 对象具有 Provider 和 Category,这点很重要!

        而过滤便是针对 Provider 和 Category 设置的。

    2.1 过滤类型

        可以为某个 Provider 的某个 Category 设置一条过滤规则,也可以针对所有的Provider 和所有的Category 设置一条过滤规则。

        这样过滤规则的类型也就可以如下所示:

    表1:

    Provider 限定

    Provider 不限定

    Category 限定

    1

    3

    Category 不限定

    2

    4

    2.2 过滤规则

    (1)minimum level

        最低级别的意思是框架只会将高于(包括等于)此级别的日志传递给 Provider,进而 Provider 调用 log()方法处理日志。

    (2)Filter functions

    Func<string, LogLevel, bool> categoryLevelFilter

        这是委托签名,入参是类别 Category 名称和写日志的级别,返回是 bool 类型,也就是说可以根据类别和消息级别来决定是否写日志。

    2.3 最佳过滤规则

        至此,我可以可以添加一条过滤规则,其签名如下:

    LoggerFilterRule(string providerName, string categoryName, LogLevel? logLevel, Func<string, string, LogLevel, bool> filter)

        比如:.AddFilter<ConsoleLoggerProvider>("System", LogLevel.Critical) 便等同于:

    LoggerFilterRule("ConsoleLoggerProvider", "System", LogLevel.Critical,null)

        如果我们添加了多条过滤规则,但每个 Provider 只能对应一条过滤规则,这时应当使用以下规则:

    (1)1>2>3>4 (参考表1)

    (2)同一等级后注册高于先注册

    (3)无可用过滤规则,则不过滤

        补充,在设置过滤规则时可以同时设置 minimum level 和 Filter functions,先执行minimum level,如有必要再执行 Filter functions。

        在匹配类别 Category 时,不是字符串相同比较,是字符串前缀包含即可。

        正常的系统,对象间关系简单示意如下:

     

    图1

    3 配置示例

        设置过滤规则有两种方式:代码和配置文件

    3.1 代码

    ILoggingBuilder AddFilter<T>(this ILoggingBuilder builder, string category, LogLevel level)

        还有一些类似的签名,T 是 Provider 类型,可选, category 必选。可以实现表1中:1、2、3类型设置,4类型没有找到(应该是没有提供)

    3.2 配置文件

    {

      "Logging": {

        "LogLevel": {

          "Default": "Trace",

          "Microsoft": "Critical"

        },

        "Console": {

          "LogLevel": {

            "Default": "Debug",

            "System": "Warning"

          }

        }

      }

    }

        这是一实例配置,从上往下定义了4个过来规则,其对应的表1中的级别分别是:4、3、2、1

    4 实践一下

    (1)注册 Provider

    (2)注册 Filter

    (3)获取 ILogger

    (4)写日志

    我没有贴代码,请参考下面的git中的SampleApp。

    5 参考

    https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.1

    https://github.com/aspnet/Logging

  • 相关阅读:
    mysql8搭建innodb_cluster集群
    centos7安装(二进制包)mysql8
    apollo-配置管理中心-安装
    gitlab-源代码仓库
    Gitlab管理用户、组、权限(一)
    Gitlab基本管理(二)
    Gitlab基本管理<一>
    Gitlab在centos7上手工安装
    在kubernetes运行一个容器案例
    在linux通过kubeadm搭建kubernetes群集
  • 原文地址:https://www.cnblogs.com/850391642c/p/aspdotnet-core-logging.html
Copyright © 2020-2023  润新知