開發程式時的除錯利器 - NLog。
還在自己寫程式紀錄 log 嗎?太落伍了!! 趕快來使用簡單、方便又強大的 NLog 吧~~
以 VS2012 為例來說明如何使用【NLog】。
安裝 - 透過 NuGet 為專案安裝 NLog 套件
1. 選擇【專案】->【管理NG套件】來增加。
2. 於【線上】搜尋【NLog】,選擇【NLog Configuration】安裝。
3. 安裝完成後會發現,【NLog】與【NLog Schema】也會自動一併安裝了,此時可點擊【關閉】來離開"管理 NuGet 套件"視窗。
4. 觀察方案總管,專案的參考已加入【NLog】,主程式底下也增加了【NLog.config】與【NLog.xsd】兩個檔案。
5. 恭喜! 完成第一步,安裝完成囉!
安裝補充說明
安裝方式亦可使用【工具】->【NuGet到件管理員】->【套件管理器主控台】來安裝。
另外要補充的是,VS2012只支援到v4.4.13,v4.5以上的都不支援。
For VS2012 : https://www.nuget.org/packages/NLog/4.4.13
設定 - 以寫入文字檔為例
1. 開啟【NLog.config】,並以下列內容取代。
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true">
<!--[變數] 文字樣板 -->
<variable name="Layout" value="${longdate} | ${level:uppercase=true} | ${logger} | ${message} ${newline}"/>
<variable name="LayoutFatal" value="${longdate} | ${level:uppercase=true} | ${logger} | ${message} | ${exception:format=tostring} ${newline}"/>
<!--[變數] 檔案位置 -->
<variable name="LogTxtDir" value="${basedir}/App_Data/Logs/${shortdate}/"/>
<variable name="LogTxtLocation" value="${LogTxtDir}/${logger}.log"/>
<variable name="LogTxtLocationFatal" value="${LogTxtDir}/FatalFile.log"/>
<!--[設定] 寫入目標-->
<targets>
<target name="File" xsi:type="File" fileName="${LogTxtLocation}" layout="${Layout}"
encoding="utf-8" maxArchiveFiles="30" archiveNumbering="Sequence"
archiveAboveSize="1048576" archiveFileName="${LogTxtDir}/${logger}.log{#######}" />
<target name="FileFatal" xsi:type="File" fileName="${LogTxtLocationFatal}" layout="${LayoutFatal}"
encoding="utf-8" maxArchiveFiles="30" archiveNumbering="Sequence"
archiveAboveSize="1048576" archiveFileName="${LogTxtDir}/FatalFile.log{#######}" />
</targets>
<!--[設定] 紀錄規則-->
<rules>
<logger name="*" levels="Trace,Debug,Info,Warn" writeTo="File" />
<logger name="*" levels="Error,Fatal" writeTo="FileFatal" />
</rules>
</nlog>
2. 其他的設定,可參考【搞搞就懂的文章說明】。
PS. 2017/04/09 增加限制 log 檔案大小的功能(archiveAboveSize),細節可參考官方說明。
使用 - 寫入 log 檔
1. 建立【logger】物件
private static Logger logger = NLog.LogManager.GetCurrentClassLogger();
2. 寫入 log
logger.Trace("Trace");
logger.Debug("Debug");
logger.Info("Info");
logger.Warn("Warn");
logger.Error("Error");
logger.Fatal("Fatal");
3. 範例:
using NLog;
using System;
using System.Windows.Forms;
namespace NlogDemo
{
public partial class Form1 : Form
{
// Logger
private static Logger logger = NLog.LogManager.GetCurrentClassLogger();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, System.EventArgs e)
{
try
{
// log here
logger.Trace("Trace");
logger.Debug("Debug");
logger.Info("Info");
logger.Warn("Warn");
logger.Error("Error");
logger.Fatal("Fatal");
int div = 0;
div /= div; //故意讓系統出現例外
}
catch (Exception ex)
{
// log with exception here
logger.Trace(ex, "Trace");
logger.Debug(ex, "Debug");
logger.Info(ex, "Info");
logger.Warn(ex, "Warn");
logger.Error(ex, "Error");
logger.Fatal(ex, "Fatal");
}
}
}
}
檢視 log 檔內容
1. 依據【NLog.config】的設定,我們文字檔的【寫入目標】有兩個,一個是【File】,一個是【FileFetal】。
<!--[變數] 文字樣板 -->
<variable name="Layout" value="${longdate} | ${level:uppercase=true} | ${logger} | ${message} ${newline}"/>
<variable name="LayoutFatal" value="${longdate} | ${level:uppercase=true} | ${logger} | ${message} | ${exception:format=tostring} ${newline}"/>
<!--[變數] 檔案位置 -->
<variable name="LogTxtLocation" value="${basedir}/App_Data/Logs/${shortdate}/${logger}.txt"/>
<variable name="LogTxtLocationFatal" value="${basedir}/App_Data/Logs/${shortdate}/FatalFile.txt"/>
<!--[設定] 寫入目標-->
<targets>
<target name="File" xsi:type="File" fileName="${LogTxtLocation}" layout="${Layout}" />
<target name="FileFatal" xsi:type="File" fileName="${LogTxtLocationFatal}" layout="${LayoutFatal}"/>
</targets>
2. 【File】所設定的路徑為變數【LogTxtLocation】所定義的路徑,寫入的內容格式為變數【Layout】所定義的格式。
3. 【FileFetal】所設定的路徑為變數【LogTxtLocationFatal】所定義的路徑,寫入的內容格式為變數【LayoutFatal】所定義的格式。
4. 這些變數的定義中有使用到許多【${XXX}】的變數,為 NLog 內部定義好的變數,XXX 代表變數名稱,詳細的內容可參考【NLog - Layout Renderers】的說明。
5. 但是【target】只是設定有哪些【寫入目標】供選擇,以及其【路徑】與【內容格式】,真正設定【寫入規則】的是【rules】
<!--[設定] 寫入規則-->
<rules>
<logger name="*" levels="Trace,Debug,Info,Warn" writeTo="File" />
<logger name="*" levels="Error,Fatal" writeTo="FileFatal" />
</rules>
6. NLog 預設有六個層級供使用者使用,可分別指定各層級的【寫入規則】,也可像範例中那樣,一次設定多個層級。
7. 所以依據【NLog.config】的設定,我們會得到兩個 log 檔如下圖所示。
8. log 檔的內容分別如下:
參考資料
1. 以上範例與設定內容,99%複製使用【搞搞就懂 - [Package] 記錄檔利器NLog (Advanced .NET Logging)】的內容,如有不妥之處請告知移除,謝謝。
2. 還有參考【mrkt 的程式學習筆記 - 使用NLog - Advanced .NET Logging (1)】的說明。
3. 官網的詳盡教學【NLog - Tutorial】