1. 程式人生 > 其它 >.NET 日誌系統

.NET 日誌系統

基本概念

1.日誌級別:Trace<Debug<Information<Warning<Error<Critical

2.日誌提供者(LoggingProvider):把日誌輸出到哪裡。控制檯、檔案、資料庫等。

3.。NET等日誌非常靈活,對於業務程式碼只要注入日誌物件記錄日誌即可,具體哪些日誌輸出到哪裡、什麼樣的格式、是否輸出等都有配置或者初始化程式碼決定。

輸出到控制檯

1.NuGet:Microsoft.Extensions.Logging 日誌基礎包

、Microsoft.Extensions.Logging.Console 往控制檯輸出包

2.DI注入:

services.AddLogging(logBuilder=>{

logBuilder.AddConsole();//可多個Provider

})

3.需要記錄日誌的程式碼,注入ILogger<T>即可,T一般就用當前類,這個類的名字會輸出到日誌,方便定位錯誤。然後呼叫LogInformation()、LogError()等方法輸出不同級別的日誌,還支援輸出異常物件。

其他日誌提供者

1.Console只適合開發階段,why?執行階段需要輸出到檔案等。

2.採用和Configuration類似的擴充套件機制,不僅內建了Debug、事件檢視器、檔案、Azure日誌等提供者,還可以擴充套件。Provider可以共存。

3.EventLog:Windows Only。在Windows下部署的程式、網站執行錯誤、不正常,先去EventLog看看。

NuGet安裝:

Microsoft.Extensions.Logging.EventLog。然後logBuilder.AddEventLog()。

文字日誌

1.為什麼文字日誌一般按照日期區分?

2.如何避免文字日誌把磁碟撐爆?限制日誌總個數或者總大小。

3.如何避免一個日誌檔案太大的問題?ICBC故事。限制單個檔案大小。

NLOG

1. .NET沒有內建文字日誌提供者。第三方有Log4Net、NLog、Serilog等。老牌的Log4Net另搞一套,不考慮。

2.NLog,NuGet安裝:NLog.Extensions.Logging (using NLog.Extensions.Logging;)。專案根目錄下建nlog.config,注意檔名單大小寫(考慮linux)。也可以說其他檔名,但是需要單獨配置。約定大於配置。

3.增加logBuilder.AddNLog()

日誌分類、過濾

1.為什麼要日誌分類?不同級別或者不同模組的日誌記錄到不同的地方。

2.為什麼要日誌過濾?專案不同階段(比如剛上線和穩定後)需要記錄的日誌不同。嚴重錯誤可以呼叫簡訊Provider等。

3.搞一個新的類,放到SystemServices這個名稱空間下,然後輸出一些日誌。然後呼叫很多次日誌執行的程式碼。nlog.config如備註所改。archiveAboveSize等引數的意義見下一頁。

引數解讀

1.archiveAboveSize為“單個日誌檔案超過多個位元組就把日誌存檔”,單位為位元組,這樣可以避免單個檔案太大,如果不設定maxArchiveFiles引數,則檔案日誌存檔檔案數量會一直增加,而如果設定maxArchiveFiles引數後,則最多儲存maxArchiveFiles指定數量個數的存檔檔案,舊的會被刪掉;當然也可以不設定maxArchiveFiles引數,而設定maxArchiveDays引數,這樣可以設定儲存若干天地日誌存檔。

2.這些不同引數的起到什麼作用?“滾動日誌”策略。

rules

1.rules節點下可以新增多個logger,每個logger都有名字(name屬性),name是萬用字元格式的。

2.logger節點的minlevel屬性和maxlevel屬性,表示這個logger接受日誌的最低級別和最高級別。

3.日誌輸出時,會從上往下匹配rules節點下所有的logger,若發現當前日誌的分類名和level符合這個logger的name的萬用字元,就會把日誌輸出給這個logger。如果匹配多個logger,就把這條日誌輸出給多個logger。但是如果一個logger設定了final=“true”,那麼如果匹配到這個logger,就不繼續向下匹配其他logger了。

NLog其他

1.NLog部分功能和.NET的Logging重複,比如分類、分級、各種Provider。

2.為了避免衝突,如果用NLog,建議不要再配置.NET的分級等(具體用法見微軟文件)。

結構化日誌

結構化日誌比普通文字更利於日誌的分析,比如統計“郵件傳送失敗”錯誤發生了多少次。

集中化日誌

叢集化部署環境中,有N多伺服器,如果每個伺服器都把日誌記錄到本地檔案,不便於查詢、分析。需要把日誌儲存到集中化的日誌伺服器中。

Serilog

1.NLog也可以配置結構化日誌,不過配置麻煩,推薦用Serilog。

2.NuGet安裝:Serilog.AspNetCore。

3.Log.Logger=new LoggerConfiguration()

.MinimumLevel.Debug()

.Enrich.FromLogContext()

.WriteTo.Console(new JsonFormatter())

.CreateLogger();

builder.AddSerilog();

4.要記錄到結構化資料通過佔位符來輸出:

logger.LogWarning("新增使用者{@person}",new {Id=3,Name="xy"});

5.同樣可以輸出到檔案、資料庫、MongoDB等。

集中日誌服務

1.使用NLog、Serilog等可以把日誌記錄到資料庫、MongoDB等地方,就可以實現“結構化、集中日誌服務”,不過需要自己編寫日誌分析程式。

2.公有云廠商一般都有提供了日誌伺服器,都帶分析功能,都有對應Serilog外掛,即使沒有提供,開發一個外掛也不麻煩。

3.如果沒有用雲平臺或者想自己控制日誌服務,可以使用Exceptionless或者ELK等。

4.Exceptionless、ELK即提供了現成的雲服務,也提供了自己部署(Selt Hosting)的模式。由於網速等原因,雲服務不符合中國的要求,不過可以試用一下,看是否滿足要求,再自己部署。

Exceptionless

1.到Exceptionless官網註冊、登入後,新建一個專案,按照嚮導輸入公司名字、專案名字後,網站就會給出一個apiKey

2.專案NuGet安裝Serilog的Exceptionless外掛:Serilog.Sinks.Exceptionless.

3.在程式的最開始加上一句ExceptionlessClient.Default.Startup("拿到的apiKey"),然後Serilog的配置中加上一句:.WriteTo.Exceptionless()

總結

1.普通專案用NLog輸出到文字檔案即可,跟根據需要設定過濾、分類規則。

2.叢集部署的專案用Serilog+“集中式日誌服務”。需要記錄機構化日誌,再進行結構化輸出。

3.如果用雲服務的就夠了,就用雲服務的,免得自己部署;如果想自己控制日誌資料就用自部署Exceptionless或者ELK(難度大)等。