只有累積,沒有奇蹟

2018年12月8日 星期六

[.NET] 如何在 NLog 進行偵錯

發生情境
NLog 是在.NET 開發者中很受歡迎的 Open Source支援 .NET Framework 和 .NET Core安裝上可以很簡單的透過 Nuget 安裝下載使用,透過 NLog 定義的 Configure 定義專案自行紀錄/輸出的 Log Level 格式
,近同事反應在開發新專案使用上遇到離奇的事情,在使用 NLog 寫錯誤訊息時沒有辦法正常寫入到檔案中,NLog 在遇到問題時預設是不會 throw exception 的需要打開 NLog config 的 root element 一些設定
,以下簡單紀錄幫忙偵錯 NLog 的過程及該如何處理

偵錯方法 : 開啟 throwExpections = true
NLog 在遇到問題時預設是不會 throw exception,偵錯時可以開啟 throwExceptions = "true" 的設定,讓我們在除錯過程中知道 NLog 的錯誤訊息可以透過以下兩種方式設定
1. NLog Config
   在 NLog config 的根 element 定義 throwExceptions = true 
2. 在程式中設定
        static void Main()
        {
            LogManager.ThrowExceptions = true;

            Logger logger = LogManager.GetCurrentClassLogger();
            logger.Info("Start");
            logger.Info("This is a book");
        }

偵錯方法 : 開啟 NLog Internal Logging 設定
NLog 有自己的 logging 機制可以提供偵錯及除錯使用一般我們常用的都是 NLog.Logger 類別來記錄訊息,在需要使用內部 Logging 機制時可以用 InternalLogger 類別,使用上與 Logger 有點相似需要定義 LoggerLevel, Logger FileName 等資訊,在偵錯時可以設定以下兩個 attribute 設定紀錄 internalLogger 的錯誤訊息 ( 亦可在 NLog 檔案設定 )
1. internalLogFile : 設定 internalLogging 時檔案寫入的位置
2. internalLogLevel : 設定需要寫入的 Log Rule level
        static void Main()
        {
            InternalLogger.LogFile = "c:\\Logs\\log.txt";            
            InternalLogger.LogLevel = LogLevel.Error;
        }
 

後記
透過以上設定就可以看到 NLog 內部的錯誤訊息,可以更明確的知道程式爆炸的地方
舉例以一開始幫同事 Debug 的案例如下圖,發現他的NLog file copy 別專案的config內容,但未 copy 到 NLog_ELK的config內容導致 LogManager 讀取失敗發生 FileNotFount exception宣告結案 !!!




參考
Logging Troubleshooting
NLog
NLog Tutorial
NLog internalLogging

0 意見:

張貼留言

Copyright © m@rcus 學習筆記 | Powered by Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com