星期三, 6月 15, 2022

[C#] NLog - Targets 和 Rules

透過 .net framework console 專案來了解並紀錄 NLog 5.0 使用方式

安裝 NLog

從官方文件 - Installing NLog 可以看見需要安裝 NLog 和 NLog.Config,但在安裝 NLog.Config 時發現該套件已經被淘汰,且 NLog.Config 現在可以透過程式產生 - Configure from code

[C#] NLog-1


Target 和 Rules

NLog 內的設定重點,透過兩者設定搭配來決定用哪種條件、方式來產生 Log

透過 Code 來建立 NLog 設定檔並觀察不同 Target 搭配 LogLevel 的輸出結果

LogLevel 依嚴重性排序依序為:Trace、Debug、Info、Warm、Error、Fatal,下圖為 VS Intellisence 的各 LogLevel 情境說明

[C#] NLog - Targets 和 Rules-4
using NLog;
using System;

namespace NLogSample
{
    internal class Program
    {
    	// 透過 LogManager.GetCurrentClassLogger() 取得 NLog 設定檔
        private static readonly Logger _logger = LogManager.GetCurrentClassLogger();

        static void Main(string[] args)
        {
            LogLevelConfig();

            try
            {
                int numerator = 1;
                int denominator = 0;
                Console.WriteLine(numerator / denominator);
            }
            catch (Exception ex)
            {
                // 觸發 Target1:ErrorFile 和 Taget3:ColoredConsole
                _logger.Error(ex, "輸入 Error 相關說明");
                // 觸發 Target2:FatalFile 和 Taget3:ColoredConsole
                _logger.Fatal(ex, "輸入 Fatal 相關說明");
                // 觸發 Taget3:ColoredConsole
                _logger.Trace(ex);
            }
        }

        private static void LogLevelConfig()
        {
            var config = new NLog.Config.LoggingConfiguration();

            // Target 1:
            // 當 LogLevel = Error 時,會根據 ErrorFile 設定,把錯誤訊息輸出至 txt 檔案 
            var errorFile = new NLog.Targets.FileTarget("errorfile") { FileName = "ErrorFile.txt" };
            config.AddRule(LogLevel.Error, LogLevel.Error, errorFile);

            // Target 2:
            // 當 LogLevel = Fatal 時,會根據 FatalFile 設定,把錯誤訊息輸出至 txt 檔案 
            var fatalFile = new NLog.Targets.FileTarget("fatalfile") { FileName = "FatalFile.txt" };
            config.AddRule(LogLevel.Fatal, LogLevel.Fatal, fatalFile);

            // Target 3:
            // 在 console 內發生 Exception 的話,其實不會顯示錯誤訊息,特地把它顯示出來
            // LogLevel.Trace 到 LogLevel.Fatal 代表任何情況都會觸發
            var coloredConsole = new NLog.Targets.ColoredConsoleTarget("ColoredConsole");
            config.AddRule(LogLevel.Trace, LogLevel.Fatal, coloredConsole);

            LogManager.Configuration = config;
        }
    }
}

ColoredConsole 輸出會根據 LogLevel 呈現不同顏色

[C#] NLog-2

根據不同 LogLevel 產生 Log 到不同 File 去,自行輸入的文字也會出現在 Log 資訊內

[C#] NLog-3

Layouts 和 Layouts Renderers

Log 內容輸出,可以透過 Layouts 和 Layouts Renderers 來變化,該部分只介紹預設輸出
預設輸出文字格式可以參考 官方文章 - TextLayout,文字格式分為四部份,以 | 符號分隔
 ${longdate}|${level:uppercase=true}|${logger}|${message:withexception=true}
因為有自行加入文字,所以會變成
${longdate}|${level:uppercase=true}|${logger}|文字輸入|${message:withexception=true}

沒有留言:

張貼留言