C#日誌使用
日誌框架
框架選擇:NLog
安裝方法,Nuget命令列:Install-Package NLog
常用規則
- 儘量不要在迴圈中列印日誌。
- 應輸出錯誤的堆疊資訊:
e.Message
僅為異常描述,e.ToString()
可以列印異常堆疊。 - 拋異常的地方不要列印日誌,因為一般捕獲異常的地方會列印,多次列印造成重複輸出。
- 日誌級別的使用要準確。
- 關鍵資訊可以加顯眼的符號,如程式啟動時:
======= app start =======
,方便快速定位資訊。 - 不要使用
Console.WriteLine()
,效率低。 - 日誌的保持時間應在15天以上重要日誌適當延長。
- 配置日誌框架輸出格式的內容不要包含類名、函式名、行號等資訊,這種行為消耗巨大。
- 謹慎記錄日誌,避免輸出大量無效日誌、資訊不全的日誌。
- 日誌函式的引數不要使用拼接字串,使用格式化字串。
應該列印什麼日誌
- 除錯日誌:開發階段使用大量除錯日誌,方便除錯,上線後禁止。
- 執行日誌:記錄程式的執行,該部分日誌應能體現程式的執行流程。
- 狀態日誌:記錄程式的狀態,用於資料展示。
NLog功能簡介
NLog使用
- 使用單獨檔案進行NLog配置,檔名命名為NLog.config
- 配置
autoReload="true"
:配置修改是否自動載入。 - 配置
throwExceptions="false"
:日誌出現異常時是否需要丟擲異常,若配置為true日誌記錄異常時由於沒有捕獲異常,會導致程式掛掉。 - 配置
internalLogLevel=Debug
:表示nlog日誌的執行日誌記錄等級,開發過程中配置為Debug,上線後配置為Info。 - 配置
internalLogFile
:表示nlog日誌的執行日誌記錄的位置。通過./XXXX的方式可以配置到程式的相對目錄。日誌一律儲存到./Logs/日期/程序名.log - 日誌級別使用範圍規定為Debug-Error,只允許使用這四個級別的日誌。開發過程中將日誌等級設為Debug,上線後設置為Info。
- 配置targets的
aasync=true
:非同步儲存日誌,從而防止日誌影響業務效能。
日誌等級
Level | FirstCharacter | Ordinal |
---|---|---|
Trace | T | 0 |
Debug | D | 1 |
Info | I | 2 |
Warn | W | 3 |
Error | E | 4 |
Fatal | F | 5 |
Off | O | 6 |
通過NLog.LogManager.GetLogger我們可以獲取一個日誌物件示例。傳入的引數為日誌例項名,我們可以在日誌名中通過${logger}引數輸出日誌例項名。可以將不同的日誌儲存到不同的檔案。
targets配置
NLog通過target配置日誌輸入的目標。可以通過配置多個target將日誌輸入到多個目錄,多個目標(檔案,網路,資料庫等)。如通過設定2個目標,將info和error日誌分開儲存。其中很多引數是共用的,我們可以設定一個預設引數default-target-parameters,減少配置檔案節點。
xsi:type
:輸入型別:
- ColoredConsole : 使用可自定義的顏色將日誌訊息寫入控制檯。
- Console - 將日誌訊息寫入控制檯。
- Debug - 模擬目標-用於測試。
- File - 將日誌訊息寫入一個或多個檔案。
- Mail - 使用 smtp 協議或拾取資料夾通過電子郵件傳送日誌郵件。
- Null - 丟棄日誌訊息。主要用於除錯和基準測試。
name
:目標的名字,可以通過建立Rule規則限制目標的輸出。
filename
:檔名,日誌儲存檔案時可以儲存到該檔案中。檔名支援引數化,通過各種引數更方便的輸出日誌。
archiveFileName
:為了防止日誌檔案儲存的太大,我們將日誌檔案拆分儲存。通過archiveFileName引數設定儲存格式,具體格式可以到這裡檢視。
createDirs
:若設定的日誌資料夾不存在,則自動建立資料夾。
keepFileOpen
:為了提高檔案寫入效能,避免每次寫入檔案都開關檔案,將keepFileOpen
設定為true,我們通過openFileCacheTimeout
引數定時關閉檔案。
autoFlush
:為了提高日誌寫入效能,不必每次寫入日誌都直接寫入到硬碟上,將autoFlush
設定為false,我們通過openFileFlushTimeout
引數定時寫入檔案。
openFileCacheTimeout
:將keepFileOpen
引數設定為false,則設定定時關閉日誌。防止日誌一直開著佔用著。
openFileFlushTimeout
:將autoFlush
引數設定為false,則設定定時將日誌從快取寫入到硬碟時間。
archiveAboveSize
:為了防止一個檔案日誌太大,我們需要根據指定大小將日誌拆檔案儲存。archiveAboveSize
引數的單位是位元組。通過設定為10240=10KB,每個日誌大小達到10KB就會自動拆分檔案,拆分後的檔名規則通過archiveFileName
設定,拆分檔名的規則通過archiveNumbering
設定,具體規則可以檢視這裡。
concurrentWrites
:支援多個併發一起寫檔案,提高檔案寫入效能。
encoding
: Nlog預設儲存的編碼格式為Encoding.Default,中文儲存到日誌中會出現亂碼,將其設定為utf-8,就可以正常儲存了。
layout
:表示輸出的格式,若為最簡單的內容輸入,則直接通過引數設定輸入格式即可。除了最簡單的文字格式還支援以下四種類型的資料,通過xsi:type
引數設定layout的格式,如xsi:type="JsonLayout"
:
- CSV - A specialized layout that renders CSV-formatted events.
- Compound - A layout containing one or more nested layouts.
- Log4JXml - A specialized layout that renders Log4j-compatible XML events.
- JSON - A specialized layout that renders to JSON. Json格式儲存我們需要在layout節點下增加attribute來增加欄位。
rules配置
我們可以建立一系列規則約束輸出的內容。方法是在NLog節點下新增rules節點,rules節點下可以新增多個logger節點,每個logger節點為一條約束。
<rules>
<logger name="*" minlevel="Debug" writeTo="file" />
</rules>
- name:logger名稱,若為'*',則表示用於所有日誌。
- minlevel:表示當前約束的最小等級,只有等於或大於該值的日誌等級才會被記錄。
- writeTo:表示當前規則約束那個target。