• .NET Core开发实战(第18课:日志框架:聊聊记日志的最佳姿势)--学习笔记(下)


    18 | 日志框架:聊聊记日志的最佳姿势

    除了使用 CreateLogger 指定 logger 的名称,实际上还可以借助容器来构造 logger,通常情况下我们会定义自己的类

    namespace LoggingSimpleDemo
    {
        public class OrderService
        {
            ILogger<OrderService> _logger;
            
            public OrderService(ILogger<OrderService> logger)
            {
                _logger = logger;
            }
    
            public void Show()
            {
                _logger.LogInformation("Show Time{time}", DateTime.Now);
            }
        }
    }
    

    接着,将 OrderService 注入到容器中

    serviceCollection.AddTransient<OrderService>();
    IServiceProvider service = serviceCollection.BuildServiceProvider();
    var order = service.GetService<OrderService>();
    order.Show();
    

    日志级别设置为 Trace

    "LoggingSimpleDemo.OrderService": "Trace"
    

    启动程序,输出如下:

    info: LoggingSimpleDemo.OrderService[0]
          Show Time03/06/2020 23:41:38
    

    这样做的意义是什么呢?

    通常情况下并不会用 ILoggerFactory 来构造日志记录器,而是用强类型的这种依赖注入的方式来去管理我们的日志,也就是说用构造函数将泛型的 ILogger 注入进来的方式

    这样的方式有个好处就是我们不需要去为 logger 定义名字,它会默认将我们类型的名称作为记录器的名字,命名空间加上类名 LoggingSimpleDemo.OrderService ,那也就是可以在配置文件里面设置日志级别

    "LoggingSimpleDemo.OrderService": "None"
    

    这样子就没有输出

    这里面有一个小技巧,需要大家特别注意,就是当我们在记录日志的时候,尽量使用模板的方式

    _logger.LogInformation("Show Time{time}", DateTime.Now);
    

    以下两种方式效果相同,但是字符串拼接的时机不同

    _logger.LogInformation("Show Time{time}", DateTime.Now);
    
    _logger.LogInformation($"Show Time{DateTime.Now}");
    

    第一行代码是在我们决定要输出的时候,也就是在 LogInformation 内部 console 要输出的时候才做拼接的动作

    第二行代码是指我们在字符串拼接好以后,输入给了 LogInformation

    如果我们把日志级别关掉

    "LoggingSimpleDemo.OrderService": "None"
    

    两行代码都不会有输出,但是第一行代码字符串拼接的动作不会执行,第二行代码已经执行了,第一行代码节省了运行资源

    另外一个就是,在记录日志的时候,不要把敏感信息记录到日志中,记录日志的目的是为了调试或者定位问题

    总结一下

    1、日志级别定义

    日志级别会从严重程度的低到高定义,可以决定输出的最低级别

    2、日志对象获取

    可以通过 ILoggerFactory 的方式获取日志对象,对它指定一个名字,也可以通过 ILogger 泛型的模式,从容器中获取日志对象,最推荐的就是强类型的泛型模式

    3、日志过滤的配置逻辑

    可以针对 logger 的名称来进行任意的配置,日志的开关以及日志的级别

    4、日志记录的方法

    LogInformation,LogDebug,还有一些小技巧,使用模板的方式记录日志,而不是提前拼接字符串输入给日志系统

    5、避免记录敏感信息,如密码、密钥,规避安全风险

    知识共享许可协议

    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

    欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

    如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。

  • 相关阅读:
    Java注释Override、Deprecated、SuppressWarnings详解
    android: 实现跨程序数据共享
    android: 创建自己的内容提供器
    android: 通过内容提供器读取系统联系人
    android: 内容提供器简介
    android: UriMatcher的用法
    java中static{}语句块详解
    android: SQLite 数据库的最佳实践
    android: SQLite使用 SQL 操作数据库
    android: SQLite查询数据
  • 原文地址:https://www.cnblogs.com/MingsonZheng/p/12431878.html
Copyright © 2020-2023  润新知