寫Log是大部分專案都會碰到的事,
本文將介紹ASP.Net Core中Logging相關功能。
同步發表於個人點部落 - [鐵人賽Day18] ASP.Net Core MVC 進化之路 - 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做過濾。
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": "*"
}
上面Debug跟Console代表不同的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
的使用方式!