[鐵人賽Day18] ASP.Net Core MVC 進化之路 - Logging

寫Log是大部分專案都會碰到的事,

本文將介紹ASP.Net Core中Logging相關功能。

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