1. 程式人生 > >net core體系-web應用程序7asp.net core日誌組件(Logger和Nlog)

net core體系-web應用程序7asp.net core日誌組件(Logger和Nlog)

err 根據 特殊 但是 web應用 重新 以及 配置信息 develop

日誌介紹

Logging的使用

1. appsettings.json中Logging的介紹

Logging的配置信息是保存在appsettings.json配置文件中的。因為之前介紹配置文件的時候我們使用的是appsettings.Development.json這個文件,所以在介紹Logging的時候我們也用它吧。

技術分享圖片

通過上圖可以看到Logging節點,下面有兩個子節點IncludeScopes和LogLevel。

IncludeScopes表示是否要使用日誌作用域。在同一個作用域下的日誌都會打上相同的標記,告訴我們這些日誌是一組的,屬於同一個作用域。在using塊中使用,就像我們使用數據庫事物操作一樣。

LogLevel表示日誌的級別,默認Warning。如果我們在代碼中輸出Info級別的日誌,是不會有任何輸出的。因為設置的級別是Warning,只會輸出高於和等於Warning級別的日誌。

日誌的級別:Trace ->Debug-> Information ->Warning-> Error-> Critical,從左往右由低到高。

另外我們還可以指定命名空間和命名空間的日誌級別。如下圖中的System和Microsoft。當遇到System.*或者Microsoft.*開頭的命名空間,日誌級別采用Error的級別。我在這裏設為Error級別,因為如果級別設置太低的話,每次運行程序都會有一大堆的追蹤日誌。不便於我們查找想要的日誌信息。

技術分享圖片

廢話不多說了,接下來通過實例一一介紹。

2.註入Logger

因為Logger是.net core自帶的日誌輸出組件,而且默認已經存在於DI容器中,所以我們僅需通過構造方法註入Logger即可。

技術分享圖片

3.演示普通日誌

技術分享圖片

F5運行程序,通過多次刷新頁面,控制臺窗口輸出結果:

技術分享圖片

4.演示日誌級別

技術分享圖片

控制臺輸出結果:

技術分享圖片

可以看到trace級別的日誌沒有輸出。因為appsettings.json中設置的Default級別為debug,高於trace級別。

5.演示日誌作用域

技術分享圖片

首先創建一個使用控制臺作為輸出媒介的Logger工廠,同時第一個參數表示日誌的默認級別為debug,第二個參數表示使用作用域記錄日誌。

然後就是創建一個指定全名(SongLou.Web.Controllers.HomeController)的Logger實例。

最後使用using括起來,指定作用域。

輸出見下圖:

技術分享圖片

Nlog的使用

1.簡單介紹

NLog是一個基於.NET平臺編寫的類庫,我們可以使用NLog在程序中添加完善的調試追蹤代碼。根據喜好配置其表現樣式之後發送到一個或多個輸出目標(target)中。配置簡單靈活。

NLog遵從BSD license,即允許商業應用且完全開放源代碼。任何人都可以免費使用並對其進行測試,然後通過郵件列表反饋問題以及建議。

NLog日誌輸出目標:控制臺、文本文件、數據庫、Email、消息隊列等。雖然有這麽多輸出目標,但是我只會介紹控制臺和文本文件,有精力的同學可以研究其它的輸出目標。

2.targets和rules

NLog包含最基本的兩大元素:targets和rules。target用來配置日誌的輸出類型(type)、輸出目標(fileName)、輸出格式(layout)等。rules用來配置日誌的輸出規則,比如:info級別的日誌輸出到哪個target、設置日誌的最低級別。由writeTo來指定輸出到哪個target,具體的值為target的name。下面會詳細介紹。

3.安裝Nlog包

通過NuGet安裝下面兩個包,同時註意版本。

NLog.Extensions.Logging版本是:1.0.0-rtm-rc7

NLog.Web.AspNetCore版本是:4.5.0-rc3

技術分享圖片

4.添加nlog.config

如果要使用NLog,僅僅安裝它的包是不行的,還需要我們進行相關配置。

先在根目錄下添加一個空的nlog.config配置文件,如下圖:

技術分享圖片

5.修改Startup.cs

引入兩個命名空間:

using NLog.Extensions.Logging;

using NLog.Web;

修改Configure方法。添加對IloggerFactory的引用,並加入代碼:

loggerFactory.AddNLog();

env.ConfigureNLog("nlog.config");

具體看下圖:

技術分享圖片

6.NLog輸出到控制臺

Nlog的配置非常靈活,功能也很強大,所以註定配置會有很多。但是我們目前只關註在控制臺輸出日誌,其它的先不要考慮。下面給出最簡單的配置,如下圖:

技術分享圖片

配置文件完成之後,添加測試代碼,如下圖:

技術分享圖片

直接F5運行,結果如下:

技術分享圖片

日誌按照我們配置的輸出格式輸出到控制臺了。因為這個演示沒有寫文件,只是將日誌輸出到控制臺,所以它的fileName我們沒有配置,接下來的寫入到文件的演示將會用到fileName。

7.NLog輸出到文件

具體配置如下圖:

技術分享圖片

對配置做下簡單介紹。target節點中的name表示target的名字,rules節點裏面的writeTo屬性會用到。type為file,表示日誌的輸出類型是文件。fileName表示日誌輸出到哪個目錄的哪個文件,沒有會自動創建。layout表示日誌內容的格式:“日期|大寫的日誌級別|具體日誌信息|異常信息”。

再來看看rules。logger節點的name屬性表示程序中的具體類型。打個比方,我只想在NLogController這個類裏面做日誌,我就可以設置name=”SongLou.Web.Controllers. NLogController”,我這裏設置的是*號,表示在任何一個地方都可以將日誌寫入到文件。writeTo指定具體的target,我這裏設置的是name為logfile的target。

可以添加多個target,也可以添加多個logger。多個logger可以指定同一個target。

修改代碼,如下圖:

技術分享圖片

配好之後,直接按F5運行,這個時候,我們在相應的目錄就可以看到NLog成功寫入文件:

技術分享圖片

8.NLog滾動日誌介紹

什麽是滾動日誌?

在生產環境中,日誌不可能保存在一個文件裏面。隨著文件內容越來越多,單個文件也會越來越大,不僅在打開時不方便,對我們查找具體的日誌也不方便。如果保存在很多小的文件裏面,隨著程序運行的時間越來越久也會產生很多個文件,這樣做也不好。特別是現在有很多日誌搜集工具,只要能保證日誌搜集工具能夠搜集到所有的日誌即可。然後再同步到我們的數據庫(ElasticSearch),比如用logstash就可以做日誌搜集。

為了更好的理解,我畫了一張圖。假如日誌文件最多保存5個,每個大小1K。當5個文件都滿的時候,NLog會把最後一個文件刪除,前面4個文件往後移動並對文件名做+1操作重新命名。而新產生的日誌就會放在file1文件裏。

技術分享圖片

關於滾動日誌有幾個屬性做下簡單介紹。

archiveFileName:滾動文件名稱,可以設置按規則命名

archiveAboveSize:滾動文件的大小,以字節為單位

archiveNumbering:Rolling,輪轉;Sequence,升序

concurrentWrites:同一個主機是否允許多個線程並發寫日誌

maxArchiveFiles:保留文件個數

keepFileOpen:有一種特殊的方法保持文件打開狀態,設為true有助於提高性能,因為設置為true之後concurrentWrites就不起作用了。

具體配置如下:

技術分享圖片

代碼無需做任何改動,按F5運行。多刷新幾次頁面,當文件的大小達到1K時,會自動創建一個新的文件。如下圖:

技術分享圖片

net core體系-web應用程序7asp.net core日誌組件(Logger和Nlog)