1. 程式人生 > 實用技巧 >C#日誌使用

C#日誌使用

本文參考連結

日誌框架

框架選擇:NLog

安裝方法,Nuget命令列:Install-Package NLog

常用規則

  1. 儘量不要在迴圈中列印日誌。
  2. 應輸出錯誤的堆疊資訊:e.Message僅為異常描述,e.ToString()可以列印異常堆疊。
  3. 拋異常的地方不要列印日誌,因為一般捕獲異常的地方會列印,多次列印造成重複輸出。
  4. 日誌級別的使用要準確。
  5. 關鍵資訊可以加顯眼的符號,如程式啟動時:======= app start =======,方便快速定位資訊。
  6. 不要使用Console.WriteLine(),效率低。
  7. 日誌的保持時間應在15天以上重要日誌適當延長。
  8. 配置日誌框架輸出格式的內容不要包含類名、函式名、行號等資訊,這種行為消耗巨大。
  9. 謹慎記錄日誌,避免輸出大量無效日誌、資訊不全的日誌。
  10. 日誌函式的引數不要使用拼接字串,使用格式化字串。

應該列印什麼日誌

  1. 除錯日誌:開發階段使用大量除錯日誌,方便除錯,上線後禁止。
  2. 執行日誌:記錄程式的執行,該部分日誌應能體現程式的執行流程。
  3. 狀態日誌:記錄程式的狀態,用於資料展示。

NLog功能簡介

NLog使用
  1. 使用單獨檔案進行NLog配置,檔名命名為NLog.config
  2. 配置autoReload="true":配置修改是否自動載入。
  3. 配置throwExceptions="false":日誌出現異常時是否需要丟擲異常,若配置為true日誌記錄異常時由於沒有捕獲異常,會導致程式掛掉。
  4. 配置internalLogLevel=Debug:表示nlog日誌的執行日誌記錄等級,開發過程中配置為Debug,上線後配置為Info。
  5. 配置internalLogFile:表示nlog日誌的執行日誌記錄的位置。通過./XXXX的方式可以配置到程式的相對目錄。日誌一律儲存到./Logs/日期/程序名.log
  6. 日誌級別使用範圍規定為Debug-Error,只允許使用這四個級別的日誌。開發過程中將日誌等級設為Debug,上線後設置為Info。
  7. 配置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。