asp.net core 系列 13 日誌
一.概述
ASP.NET Core 支援適用於各種內建和第三方日誌記錄, 供程式的日誌記錄 API,本文介紹瞭如何將日誌記錄 API 與內建提供程式一起使用。對於第三方日誌記錄提供程式使用,文章最後有連結。
1.1 新增內建日誌提供程式
日誌記錄提供程式能夠用於顯示日誌資訊或儲存日誌,比如控制檯提供程式在控制檯上顯示日誌, Azure Application Insights 提供程式會將這些日誌儲存在 Azure Application Insights 中。 可通過新增多個提供程式將日誌傳送到多個目標。
要新增提供程式,請在 Program.cs 中呼叫提供程式的 Add{provider name}
擴充套件方法:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .ConfigureAppConfiguration((hostingContext, config) => { config.SetBasePath(Directory.GetCurrentDirectory()); config.AddJsonFile("starship.json", false, true); }) .ConfigureLogging((hostingContext, logging) => { //日誌的 預設記錄提供程式 //新增appsettings.json中關於日誌的Logging節點配置 logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging")); //日誌控制檯記錄提供程式 logging.AddConsole(); //日誌Debug記錄提供程式 logging.AddDebug(); //日誌EventSource 記錄提供程式 logging.AddEventSourceLogger(); }) .UseStartup<Startup>();
預設專案模板呼叫 CreateDefaultBuilder 擴充套件方法,該操作將新增以上日誌記錄提供程式(控制檯,Debug,EventSource):
WebHost.CreateDefaultBuilder(args)
如果要自行選擇提供程式來替換預設提供程式。 可以呼叫 ClearProviders,然後再新增所需的提供程式。
public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .ConfigureLogging(logging => { logging.ClearProviders(); //只有日誌控制檯記錄提供程式 logging.AddConsole(); }) .Build();
1.2 建立日誌
從 DI 中獲取 ILogger<TCategoryName> 物件。以下 Razor 頁面示例會建立日誌“級別”為 Warning,“T類別”為 Page2Model,的日誌:
public class Page2Model : PageModel { private readonly ILogger _logger; public Page2Model(ILogger<Page2Model> logger) { _logger = logger; } public void OnGet() { _logger.LogWarning("Load the Page2"); } }
如下所示(vs- -除錯--視窗):
1.3 啟動Startup時建立日誌
要將日誌寫入 Startup
類,建構函式簽名需包含 ILogger
引數:
public class Startup { private readonly ILogger _logger; public Startup(IConfiguration configuration, ILogger<Startup> logger) { Configuration = configuration; _logger = logger; } }
1.4 在Program中建立日誌
public static void Main(string[] args) { var host = BuildWebHost(args); var logger = host.Services.GetRequiredService<ILogger<Program>>(); logger.LogInformation("Seeded the database."); host.Run(); }
1.5 日誌配置Configuration
日誌記錄提供程式配置由一個或多個配置提供程式提供,它們可以是:
(1)檔案格式(INI、JSON 和 XML)。
(2)命令列引數。
(3)環境變數。
(4)記憶體中的 .NET 物件。
(5)未加密的機密管理器儲存。
(6)加密的使用者儲存,如 Azure Key Vault。
(7)(已安裝或已建立的)自定義提供程式。
例如,日誌記錄配置通常由應用設定檔案的 Logging
節點部分提供。 以下示例應用了典型 appsettings.Development.json 檔案的內容:
{ "Logging": { "LogLevel": { "Default": "Debug", "System": "Information", "Microsoft": "Information" }, "Console": { "IncludeScopes": true } } }
上面的配置檔案不需要使用顯示加config.AddJsonFile,這個在環境章節已講過,當程式的環境(ASPNETCORE_ENVIRONMENT)是Development時,該檔案中的Logging節點配置生效。
Logging 下的 LogLevel 屬性指定了用於記錄所選類別的最低級別,在本例中, System
和 Microsoft
類別在 Information
級別記錄,其他均在 Debug
級別記錄。
Logging 下的其他屬性均指定了日誌記錄提供程式。 本示例針對控制檯提供程式。 如果提供程式支援日誌作用域,則 IncludeScopes 將指示是否 啟用這些域.
1.6 日誌級別
每個日誌都指定了一個 LogLevel 值。 日誌級別指示嚴重性或重要程度。如果LogLevel是Warning級別,那麼跟蹤Trace ,Debug ,Information 級別將不會記錄。
ASP.NET Core 定義了以下日誌級別(按嚴重性從低到高排列):
(1) 跟蹤Trace = 0
(2) 除錯Debug = 1
(3) 資訊 Information = 2
(4) 警告 Warning = 3
(5) 錯誤 Error = 4
(6) 嚴重 Critical = 5
1.7 內建日誌記錄提供程式
(1) 控制檯
logging.AddConsole(); dotnet run 檢視控制檯日誌記錄輸出。
(2) 除錯
logging.AddDebug(); 在 Linux 中,此提供程式將日誌寫入 /var/log/message 。
(3) EventSource
logging.AddEventSourceLogger(); 在 Windows 中,它使用 PerfView 實用工具收集和檢視日誌,但尚無支援 Linux 或 macOS 的事件集合和顯示工具。
(4) EventLog
logging.AddEventLog(); 向 Windows 事件日誌傳送日誌輸出 。
(5) TraceSource
logging.AddTraceSource(sourceSwitchName);應用必須在 .NET Framework(而非 .NET Core)上執行。
1.8 第三方日誌記錄提供程式
適用於 ASP.NET Core 的第三方日誌記錄框架,連結地址官方文件中有:
elmah.io(GitHub 儲存庫)
Gelf(GitHub 儲存庫)
JSNLog(GitHub 儲存庫)
KissLog.net(GitHub 儲存庫)
Loggr(GitHub 儲存庫)
NLog(GitHub 儲存庫)
Sentry(GitHub 儲存庫)
Serilog(GitHub 儲存庫)
Stackdriver(Github 儲存庫)
例如使用 NLog :
NLog是一個靈活的免費日誌記錄平臺,適用於各種.NET平臺,包括.NET標準。NLog可以輕鬆寫入多個 目標。(資料庫,檔案,控制檯)並即時更改日誌記錄配置。
總結:
這篇主要講了asp.net core內建的日誌提供程式, 內建的日誌自帶功能還是有限,比如不能寫入到.txt檔案或資料庫中。在專案使用中還是要考慮使用第三方日誌提供程式。本篇對於內建的日誌提供程式還有:日誌訊息模板、日誌作用域、Azure 中的日誌記錄、日誌事件 ID等未介紹,具體再參考官方文件。
參考文獻
官方資料: asp.net core 日誌