ASP.NET Core擴(kuò)展庫之日志功能的使用詳解
上一篇我們對Xfrogcn.AspNetCore.Extensions擴(kuò)展庫功能進(jìn)行了簡單的介紹,從這一篇文章開始,我將逐步介紹擴(kuò)展庫中的核心功能。
日志作為非業(yè)務(wù)的通用領(lǐng)域基礎(chǔ)功能,有非常多的技術(shù)實現(xiàn),這些第三方庫避免了我們花費時間去重復(fù)實現(xiàn),不過,很多日志庫配置復(fù)雜,不易于使用,入手較難,而有些庫可能與ASP.NET Core的結(jié)合并不好。
如果我們沒有對所使用的日志庫進(jìn)行詳細(xì)了解,日志庫也可能產(chǎn)生嚴(yán)重的問題,在我的開發(fā)生涯中,曾經(jīng)遇到過多次因為日志庫而導(dǎo)致的生產(chǎn)事故。
擴(kuò)展庫日志模塊致力于將日志相關(guān)的最佳實踐進(jìn)行封裝,簡化日志庫的使用,讓我們真正從非業(yè)務(wù)代碼中解放出來。
一、簡介
ASP.NET Core擴(kuò)展庫中日志功能是對Serilog的進(jìn)一步封裝,之所以選擇Serilog,源于我們在開發(fā)工程中的實踐,我們的日志庫經(jīng)歷了自己開發(fā)、選擇使用NLog,最后定格在使用Serilog庫上。
Serilog日志庫也并不是非常易于使用,而且可能也缺少一些必要功能,這就是我們需要進(jìn)一步封裝的原因。
日志功能默認(rèn)提供了Console及File兩種日志目標(biāo),他們都分別支持文本和Json格式。
我們也添加了日志的分類、日志記錄層級的動態(tài)修改、本地文件日志的定時清理、本地日志文件的按目錄存儲、對容器化下EFK日志架構(gòu)的支持、以及日志在測試中的支持功能等。
二、使用
日志庫是隨著擴(kuò)展庫一起啟用的,最簡單的情況是啟用擴(kuò)展庫即可,默認(rèn)配置將開啟文件日志目標(biāo),日志存入應(yīng)用下Logs目錄,以日期為文件夾,以日志名稱為文件名稱。
開啟擴(kuò)展庫有兩種方式,可以在IHostBuilder上通過UseExtensions方法,或者在Startup啟動類ConfigureServices方法中通過IServiceCollection的AddExtensions方法。
// 通過IHostBuilder上的UseExtensions方法 // Program.cs .NET 5.0 public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseExtensions(args); webBuilder.UseStartup<Startup>(); }); }
或者:
// 在Startup類中 public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddExtensions(Configuration); } }
三、配置
日志的配置可以通過代碼方式或者通過配置文件方式。
采用代碼方式,在UseExtensions方法或者AddExtensions中傳入配置對象委托即可:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseExtensions(args, config=> { config.AppLogLevel = Serilog.Events.LogEventLevel.Verbose; config.SystemLogLevel = Serilog.Events.LogEventLevel.Verbose; }); webBuilder.UseStartup<Startup>(); });
如果采用配置文件方式,只需在配置源(如appsettings.json)中設(shè)置相關(guān)的配置字段:
{ "AppLogLevel": "Verbose", "AllowedHosts": "*" }
如果都采用,代碼方式將會覆蓋配置文件方式。
除此之外,如果你需要對Serilog配置進(jìn)行更詳細(xì)的控制,那么可以直接在UseExtensions方法或者AddExtensions中傳入Serilog的日志配置委托。此項委托的設(shè)置將覆蓋上述的自動配置。
四、配置日志級別
為了簡化配置,在擴(kuò)展庫中,我們根據(jù)日志名稱將日志分為系統(tǒng)日志、應(yīng)用日志以及EFCore日志,他們分別通過配置中的AppLogLevel、SystemLogLevel及EFCoreCommandLevel屬性來控制。日志級別的配置都支持運行時動態(tài)修改,無需重啟應(yīng)用。
日志分類
|
對應(yīng)日志名
|
對應(yīng)配置字段
|
默認(rèn)級別
|
系統(tǒng)日志
|
Microsoft.* 以及 System.*
|
SystemLogLevel
|
Warning
|
EFCore日志
|
Microsoft.EntityFrameworkCore.Database.Command
|
EFCoreCommandLevel
|
Information
|
應(yīng)用日志
|
除開系統(tǒng)日志及EFCore日志之外的日志
|
AppLogLevel
|
Information
|
五、日志級別的動態(tài)修改
如果你是通過配置源來配置的日志級別,那么當(dāng)配置源更新時(一般通過配置對象的Reload方法),日志級別將自動修改。
如果需要采用代碼方式,你可以通過全局的WebApiConfig實例進(jìn)行配置:
// 動態(tài)修改日志級別 var apiConfig = host.Services.GetRequiredService<WebApiConfig>(); apiConfig.AppLogLevel = Serilog.Events.LogEventLevel.Error;
六、本地文件日志配置
針對本地日志的配置,包含日志文件的路徑模板、日志文件的定時清理、日志的自動壓縮等。
本地文件日志路徑通過LogPathTemplate設(shè)置來配置,默認(rèn)為LogPathTemplates.DayFolderAndLoggerNameFile,表示以每天作為子目錄,以日志名稱作為日志文件名。通過LogPathTemplates也內(nèi)置了其他的路徑模板:
路徑模板名
|
說明
|
DayFolderAndLoggerNameFile
|
以每天日期為目錄,日志名稱為文件名
|
DayFile
|
以每天日期為日志名稱
|
LoggerNameAndDayFile
|
以[日志名稱_每天日志]為日志文件名稱
|
LevelFile
|
以日志級別縮寫為日志文件名稱
|
DayFolderAndLevelFile
|
以每天日期為目錄,日志級別縮寫為日志名稱
|
由于LogPathTemplate為字符串配置,你也可以配置其他的路徑模板。
關(guān)于日志的定時清理,可以通過MaxLogDays配置來指定日志保留的天數(shù),如果設(shè)置為0,表示不清理,這是默認(rèn)配置。
通過MaxLogFileSize以及RetainedFileCount配置可以設(shè)置日志文件的自動壓縮策略,MaxLogFileSize默認(rèn)設(shè)置為100mb,超過此大小后,日志將寫到新的文件,RetainedFileCount為可旋轉(zhuǎn)的日志文件數(shù)量,默認(rèn)為31個,超過此數(shù)量后的日志將被自動壓縮。
七、容器化支持
在容器化環(huán)境下,日志一般會采用EFK的架構(gòu),在k8s中,我們推薦F采用fluent-bit而不是filebeat。這種框架下,我們只需將日志輸出到控制臺,容器將控制臺輸出定位到Docker宿主機(jī),然后通過fluent-bit掃描日志文件,進(jìn)行解析處理,發(fā)送給ES。
在這種模式下,你需要將ConsoleJsonLog設(shè)置為true來開啟JSON格式的控制臺日志目標(biāo)。同時,由于控制臺單行字?jǐn)?shù)有限制,可能導(dǎo)致日志被截取,故可能需要通過MaxLogLength來設(shè)置單條日志的長度限制,此設(shè)置默認(rèn)為8kb,適合大多數(shù)場景。超出長度的日志并不會被忽略,而是會拆分成多條日志,以此來保證日志的完整性。
// 要支持容器化EFK日志模式,一般只需要設(shè)置ConsoleJsonLog為true即可 public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseExtensions(args, config=> { config.ConsoleJsonLog = true; }); webBuilder.UseStartup<Startup>(); });
八、測試支持
有時我們可能需要在單元測試中檢查日志的輸出,這時,我們可以使用擴(kuò)展庫在ILoggingBuilder上的擴(kuò)展方法來添加測試日志目標(biāo)。隨后,你可以通過IServiceProvider上的GetTestLogContent方法獲取已記錄的日志內(nèi)容列表。
IServiceCollection services = new ServiceCollection() .AddExtensions() .AddLogging(logBuilder => { // 添加測試日志記錄器 logBuilder.AddTestLogger(); }); IServiceProvider provider = services.BuildServiceProvider(); // 獲取日志內(nèi)容 var logContent = provider.GetTestLogContent();
九、禁用Serilog
如果你覺得上述所有功能都不太適合你的場景,但是你又需要使用擴(kuò)展庫的其他功能,那怎么辦呢? 非常簡單,你只需要將EnableSerilog設(shè)置為false,即可完全禁用上述日志功能。
有關(guān)日志的詳細(xì)配置,可參考[文檔]
Xfrogcn.AspNetCore.Extensions地址:[GitHub] [Gitee]
以上就是ASP.NET Core擴(kuò)展庫之日志功能的使用詳解的詳細(xì)內(nèi)容,更多關(guān)于ASP.NET Core擴(kuò)展庫之日志功能的資料請關(guān)注腳本之家其它相關(guān)文章!
- ASP.NET?Core記錄日志
- ASP.Net?Core中的日志與分布式鏈路追蹤
- ASP.NET Core使用NLog記錄日志
- ASP.NET Core使用Log4net實現(xiàn)日志記錄功能
- ASP.NET Core使用NLog輸出日志記錄
- ASP.NET Core擴(kuò)展庫之Http日志的使用詳解
- Asp.Net Core用NLog記錄日志操作方法
- Asp.Net Core輕松學(xué)之利用日志監(jiān)視進(jìn)行服務(wù)遙測詳解
- ASP.NET Core開發(fā)教程之Logging利用NLog寫日志文件
- ASP.NET Core 2.0 WebApi全局配置及日志實例
- 詳解ASP.NET Core應(yīng)用中如何記錄和查看日志
- ASP.NET?Core使用自定義日志中間件
相關(guān)文章
MVC HtmlHelper擴(kuò)展類(PagingHelper)實現(xiàn)分頁功能
這篇文章主要為大家詳細(xì)介紹了MVC HtmlHelper擴(kuò)展,實現(xiàn)分頁功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05刪除DataTable重復(fù)列,只刪除其中的一列重復(fù)行的解決方法
刪除DataTable重復(fù)列,只刪除其中的一列重復(fù)行,下面的方法就可以,也許有更好的方法,希望大家多多指教2013-02-02MVC4制作網(wǎng)站教程第二章 部分用戶功能實現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了MVC4制作網(wǎng)站教程,部分用戶功能實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-08-08asp.net發(fā)布后web.config中compilation的debug的值true和false區(qū)別點整理
在本篇文章里小編給大家整理的是一篇關(guān)于asp.net發(fā)布后web.config中compilation的debug的值true和false區(qū)別點內(nèi)容,有需要的為朋友們可以參考下。2020-01-01ASP.NET core Web中使用appsettings.json配置文件的方法
這篇文章主要給大家介紹了在ASP.NET core Web中使用appsettings.json配置文件的方法,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考學(xué)習(xí),下面來一起看看吧。2017-04-04