.NET Core开发实战(第18课:日志框架:聊聊记日志的最佳姿势)--学习笔记(下)...
18 | 日志框架:聊聊記日志的最佳姿勢
除了使用 CreateLogger 指定 logger 的名稱,實際上還可以借助容器來構(gòu)造 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();日志級別設(shè)置為 Trace
"LoggingSimpleDemo.OrderService": "Trace"啟動程序,輸出如下:
info: LoggingSimpleDemo.OrderService[0]Show Time03/06/2020 23:41:38這樣做的意義是什么呢?
通常情況下并不會用 ILoggerFactory 來構(gòu)造日志記錄器,而是用強(qiáng)類型的這種依賴注入的方式來去管理我們的日志,也就是說用構(gòu)造函數(shù)將泛型的 ILogger 注入進(jìn)來的方式
這樣的方式有個好處就是我們不需要去為 logger 定義名字,它會默認(rèn)將我們類型的名稱作為記錄器的名字,命名空間加上類名 LoggingSimpleDemo.OrderService ,那也就是可以在配置文件里面設(shè)置日志級別
"LoggingSimpleDemo.OrderService": "None"這樣子就沒有輸出
這里面有一個小技巧,需要大家特別注意,就是當(dāng)我們在記錄日志的時候,盡量使用模板的方式
_logger.LogInformation("Show Time{time}", DateTime.Now);以下兩種方式效果相同,但是字符串拼接的時機(jī)不同
_logger.LogInformation("Show Time{time}", DateTime.Now);_logger.LogInformation($"Show Time{DateTime.Now}");第一行代碼是在我們決定要輸出的時候,也就是在 LogInformation 內(nèi)部 console 要輸出的時候才做拼接的動作
第二行代碼是指我們在字符串拼接好以后,輸入給了 LogInformation
如果我們把日志級別關(guān)掉
"LoggingSimpleDemo.OrderService": "None"兩行代碼都不會有輸出,但是第一行代碼字符串拼接的動作不會執(zhí)行,第二行代碼已經(jīng)執(zhí)行了,第一行代碼節(jié)省了運行資源
另外一個就是,在記錄日志的時候,不要把敏感信息記錄到日志中,記錄日志的目的是為了調(diào)試或者定位問題
總結(jié)一下
1、日志級別定義
日志級別會從嚴(yán)重程度的低到高定義,可以決定輸出的最低級別
2、日志對象獲取
可以通過 ILoggerFactory 的方式獲取日志對象,對它指定一個名字,也可以通過 ILogger 泛型的模式,從容器中獲取日志對象,最推薦的就是強(qiáng)類型的泛型模式
3、日志過濾的配置邏輯
可以針對 logger 的名稱來進(jìn)行任意的配置,日志的開關(guān)以及日志的級別
4、日志記錄的方法
LogInformation,LogDebug,還有一些小技巧,使用模板的方式記錄日志,而不是提前拼接字符串輸入給日志系統(tǒng)
5、避免記錄敏感信息,如密碼、密鑰,規(guī)避安全風(fēng)險
總結(jié)
以上是生活随笔為你收集整理的.NET Core开发实战(第18课:日志框架:聊聊记日志的最佳姿势)--学习笔记(下)...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 客户端内存优化分析
- 下一篇: 《ASP.NET Core 微服务实战》