【C#.Net】使用 NLog - Advanced .Net Logging 來記錄 log 檔

  • 47458
  • 0
  • 2018-05-19

開發程式時的除錯利器 - 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

最新版:http://nlog-project.org/

設定 - 以寫入文字檔為例

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