ASP.NET Core的日志系統介紹
.net core是內置瞭日志系統的,本文這裡簡單的介紹一下它的基本用法。如下是一個簡單的示例:
var service = new ServiceCollection() .AddLogging(logging => { logging.AddConsole(); }); var provider = service.BuildServiceProvider(); var logFactory = provider.GetService<ILoggerFactory>(); var logger = logFactory.CreateLogger("MyLogger"); logger.LogInformation("hello world. {0}", DateTime.Now);
主要步驟如下:
-
在DI服務中通過AddLogging的配置日志服務
-
通過DI服務獲取ILoggerFactory
-
通過日志工廠創建ILogger
-
通過ILogger寫日志
需要註意的是,日志是異步輸出的,如果調用logger.LogInformation後程序馬上結束,是不會有日志輸出的。
ILogger和ILogger<T>
ILogger是我們實際用-來記錄日志的對象,前面的例子已經演示瞭它的使用方法,在.net core日志系統中,還提供瞭另一個接口ILogger<T>,它的創建方式如下:
var logger = logFactory.CreateLogger<Program>();
ILogger<T>本身也是繼承自ILogger的,也就是說,他們的用法基本一樣,ILogger<T>的主要區別是創建的時候無需制定數據源名稱,它的數據源就是類名,也就是說,它和如下方式創建的ILogger功能基本上是一致的。
var logger = logFactory.CreateLogger(typeof(Program).FullName);
那麼為什麼要創建一個ILogger<T>呢?我個人認為應為因為獲取它是不需要制定參數,更容易和DI框架集成,我們可以通過如下代碼獲取ILogger<T>,而不需要先獲取ILoggerFactory
var logger = provider.GetService<ILogger<Program>>();
日志結構
.net core的日志系統支持不同的日志框架,並且對外統一瞭日志的格式,不管使用哪種庫,它的格式是一樣的。這樣的好處是切換日志框架時,上層應用無需修改。一個基本的日志樣例為:
info: MyLogger[0]
hello world. 03/23/2019 22:37:58
它主要包括如下幾個部分:
-
日志級別: 日志級別定義在LogLevel枚舉中,它包含如下幾個級別:Trace、Debug、Information、Warning、Error、Critical。另外還有一個特殊級別None,它的值比Critical還高,主要用於關閉日志輸出, 當配置最小輸出級別時None時,由於它的級別比Critical還高,則所有的日志都不會輸出。
-
日志源: 用於標志日志的數據源,它是一個字符串,保存在具體的ILog對象中,本例中就是"MyLogger"
-
事件Id: 它標志瞭日志的序列號,大部分的時候都不會用到它
-
日志體: 日志內容
日志提供程序
ASP.NET Core 內置瞭如下幾種日志提供程序:
-
控制臺
-
調試
-
EventSource
-
EventLog
-
TraceSource
前面的示例中,如果要增加其他的日志提供程序,可以在DI框架初始化的時候進行。
var service = new ServiceCollection() .AddLogging(logging => { logging.AddConsole(); }); var provider = service.BuildServiceProvider(); var logFactory = provider.GetService<ILoggerFactory>(); var logger = logFactory.CreateLogger("MyLogger"); logger.LogInformation("hello world. {0}", DateTime.Now);
雖然系統內置瞭這些日志框架比較方便,但實際上用起來是不夠用的,比如說它不能輸出到文件,不過好在.net core提供瞭比較強大的擴展機制。
采用同樣的方式,我們也可以使用NLog、Seriallog等更為專業的日志框架,甚至他們已經做好瞭適配,直接拿來用都可以。
-
elmah.io
-
Gelf
-
JSNLog
-
KissLog.net
-
Loggr
-
NLog
-
Sentry
-
Serilog
-
Stackdriver
Log配置文件
一個典型的日志系統的配置文件如下:
{ "Logging": { "LogLevel": { // 表示全局 "Default": "Warning" // 不指定CategoryName,應用於所有Category }, "Console": { // 指定 ProviderName,僅針對於 ConsoleProvider "Default": "Warning", "Microsoft": "Error" // 指定CategoryName為Microsoft的日志級別為Error } } }
我們可以通過AddConfiguration函數指定日志配置文件:
var configBuilder = new ConfigurationBuilder().AddJsonFile("appsettings.json"); var config = configBuilder.Build(); var service = new ServiceCollection() .AddLogging(logging => { logging.AddConfiguration(config.GetSection("Logging")); logging.AddConsole(); });
到此這篇關於ASP.NET Core日志系統的文章就介紹到這瞭。希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Asp.net core程序中使用微軟的依賴註入框架
- .net core日志系統相關總結
- .Net Core日志記錄之自定義日志組件
- Python logging簡介詳解
- .net新興日志框架Serilog簡介