iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 18
1

前言

寫Log是大部分專案都會碰到的事,
本文將介紹ASP.Net Core中Logging相關功能。

同步發表於個人點部落 - [鐵人賽Day18] ASP.Net Core MVC 進化之路 - Logging

Logging with DI

ASP.Net Core預設將Loggin API使用DI注入,

如果對DI不熟的朋友可以參考以下兩篇:

Program.cs中可以調整Logger Provider來源,
預設為DebugProvider + ConsoleProvider兩種。
透過下列指令可將預設的Logger Provider移除。

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureLogging(logging =>
        {
            logging.ClearProviders();
            logging.AddConsole();
        })
        .Build();

接著我們要透過建構式注入的方式取得Logger
下方將會使用HomeController示範。

public class HomeController : Controller
{
    private readonly ILogger logger;

    public HomeController(ILogger<HomeController> _logger)
    {
        this.logger = _logger;
    }


    public IActionResult Index()
    {
        logger.LogInformation("Loggin Information in ASP.Net Core");
        return View();
    }
}

注入時需使用ILogger<TCategoryName>的格式,
TCategoryName表示要呼叫的完整類別名稱(上例中為HomeController)。
喔對了,因為寫Log應該是快狠準的,
所以官方並沒有提供非同步的方法。

執行之後來觀察一下結果。

因為在偵錯階段會顯示很多有關IIS Express狀態的訊息,
如果要第一眼就找到Log有點困難,
但我們可以針對Log Level做過濾。

Log Level

  • Trace = 0 :代表要追蹤的訊息,可能是開發環境中特別註記的資訊等。
  • Debug = 1:在開發過程用來偵錯記錄的訊息,通常應該是測完就要拿掉。
  • Information = 2:比較適合拿來記錄一般的資訊,如Request-Response時間記錄等。
  • Warning = 3:代表某些具有警告性的訊息,如找不到檔案等。
  • Error = 4:表示應用程式狀態有錯誤,如網路連線失敗、目標API沒有回應、資料庫鍵值重複等。
  • Critical = 5:最後一個等級代表不處理會炸掉那種,通常像是磁碟空間不足、或者資料庫連線失敗等。

我們可以從組態中設定要過濾的Level。
appsettings.json

{
  "Logging": {
    "Debug": {
      "LogLevel": {
        "Default": "Warning"
      }
    },
    "Console": {
      "IncludeScopes": false,
      "LogLevel": {
        "Microsoft": "Warning",
        "Default": "Information"
      }
    },
    "LogLevel": {
      "Default": "Debug"
    }
  },
  "AllowedHosts": "*"
}

上面DebugConsole代表不同的LogProvider(模式),
最下面的LogLevel那段代表「如果沒有特別指定Provider的過濾規則」就套用這條規則。

LogLevel中Default代表手刻寫出來的Log,
其他像是Microsoft這類的代表可針對某串命名空間(namespace)做Level過濾。
我們將Console模式中Microsoft的等級調成Warning(Level = 3),
Default調成Information(LogLevel = 2)。
Debug模式的Default則選為Warning(Level = 3)。

最後調整一下Action中的內容。

public IActionResult Index()
{
    logger.LogTrace("Loggin Level = 0 (Trace)");
    logger.LogDebug("Loggin Level = 1 (Debug)");
    logger.LogInformation("Loggin Level = 2 (Information)");
    logger.LogWarning("Loggin Level = 3 (Warning )");
    logger.LogError("Loggin Level = 4 (Error)");
    logger.LogCritical("Loggin Level = 5 (Critical)");
            
    return View();
}

Console Provider測試結果

Debug Provider測試結果

通常我們都會希望Log長出來是同一個媽生的,
如果想要自訂Template套用Log,
有提供param多參數string format的方法。

logger.LogCritical("Excuting Time = {date}", DateTime.Now);

但使用是並不是那麼方便,
畢竟你的Log可能很多地方都會寫,
這部分還是無腦整合NLog修改target比較實際XD。
Log的基礎就介紹到這邊,
下篇會介紹NLog的使用方式!

參考

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?tabs=aspnetcore2x&view=aspnetcore-2.1


上一篇
[鐵人賽Day17] - Filter
下一篇
[鐵人賽Day19] - NLog
系列文
菜鳥練等區-ASP.Net Core MVC進化之路30

尚未有邦友留言

立即登入留言