iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 2
0
Software Development

ASP.NET Core 之 Log 紀錄和追蹤的愛恨交織系列 第 2

Day 02 - ASP.NET Core 內建之 Logger 01

ASP.NET Core 其實本身已經內建了一套 Log 工具,透過 DI 的方式注入,就可以直接取得並使用 Log 的物件實體,而且也可以外掛第三方的 Log 架構

方便的是 ASP.NET Core 預設就已經將 Logger 物件放入 DI 容器中了,所以不需要再額外進行設定,只要直接透過 DI 的方式取得 Logger 物件實體


Logger 物件提供了不同層級的 Log,共分為六種,定義在 LogLevel 列舉中

  • Trace = 0
    通常是用來輸出在開發或是偵錯過程中想要看到的資訊。 這些訊息可能包含敏感資訊,因此不應該在正式環境中啟用。
    預設為不輸出。
    例如:Credentials: {"User":"User", "Password":"P@ssw0rd"}
  • Debug = 1
    通常是用來在正式環境中記錄一些除錯資訊。 由於此層級的 Log 數量可能很可觀,所以平常是不會開啟的,直到有需要時再開啟。
    預設為不輸出。
    例如:Emergency flag set to true.
  • Information = 2
    通常是用來追蹤應用程式的操作或是運作流程。
    例如:Request received for order id: 201809191111
  • Warning = 3
    在應用程式流程中發生異常或意外事件。 這些記錄可能包含不會造成應用程式停止,但可能需要進行調查的錯誤或其他狀況。 已處理的例外狀況即為使用 Warning 記錄層級的常見位置。 
    例如:FileNotFoundException for file quotes.txt.
  • Error = 4
    發生無法處理的錯誤和例外狀況。 這些訊息會指出目前的活動或作業 (例如目前的 HTTP 要求) 中的失敗,而不是整個應用程式的失敗。 
    例如:Cannot insert record due to duplicate key violation.
  • Critical = 5
    發生需要立即注意的失敗。 
    例如:資料庫連線失敗、磁碟空間不足等情況。

如以下範例程式碼,直接宣告 Logger 物件,並透過 DI 容器注入,注意要引用 using Microsoft.Extensions.Logging; 命名空間,且 Logger 物件為泛型,所以要指定 Class 名稱,以此為例就是: ILogger<HomeController>

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;

namespace Day01_03___ASP.NET_Core_Logging.Controllers 
{
    public class HomeController : Controller 
    {
        private ILogger logger;

        public HomeController (ILogger<HomeController> log) 
        {
            logger = log;
        }

        public IActionResult Index () 
        {
            logger.LogDebug (LoggingEvents.CreateAction, "Log Debug");
            logger.LogInformation (LoggingEvents.EditAction, "Log Information");
            logger.LogWarning (LoggingEvents.GetAction, "Log Warning");
            logger.LogError (LoggingEvents.DeleteAction, "Log Error");
            logger.LogCritical ("Log Critical");
            return Content ("");
        }
    }

    public class LoggingEvents 
    {
        public const int CreateAction = 1000;
        public const int EditAction = 1001;
        public const int GetAction = 1002;
        public const int DeleteAction = 1003;
    }
}

寫完程式碼後,就可以執行來看看,先在 terminal 中輸入 dotnet run 指令來進行編譯並把應用程式跑起來,跑起來後就可以直接呼叫網頁,最後在 terminal 中就可以看到 Log 的輸出結果

在上圖的第二步驟紅框中,就可以看到 Log 輸出的結果,針對不同層級也會有不同的顯示樣式

而在第二步驟的綠框中則是事件代碼,通常在系統中都會定義事件代碼
例如說:資料庫無法連線的錯誤代碼設定為 001

因此在寫入 Log 時也可以傳入事件代碼以供事後快速辨別


還有一小部分要提到的是預設格式化訊息的方式,假設有 Log 事件如下

string str1 = "name1";
string str2 = "name2";
logger.LogDebug ("{str2} not match with: {str1}", name1, name2);

因其格式化的方式是依照參數的先後順序,而非於字串中的變數名稱而定
所以其輸出結果會為:name1 not match with: name2


也可以將例外傳入到 Log 裡

var ex = new NotImplementedException("Take easy.");
logger.LogCritical (ex, "Log Critical");


下一篇來介紹ASP.NET Core 內建之 Logger的組態設定、如何設定要記錄的 Log 層級以及如何輸出 Log 到不同的地方,而不是只是寫到 Console


上一篇
Day 01 - 前言
下一篇
Day 03 - ASP.NET Core 內建之 Logger 02
系列文
ASP.NET Core 之 Log 紀錄和追蹤的愛恨交織5
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言