日志介紹
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時,會自動創建一個新的文件。如下圖:

