ASP.Net Core -- Logging
ASP.Net Core裡的LOG系統
• EventSource
• ILogger
• DiagnosticSource
EventSource和DiagnosticSource是ASP.Net Core預設的,它會預設使用這兩個,今天主要學習ILogger,它是基於Providers提供商,比如內建的有控制檯提供商,等等。當然,我們自己也可以對其擴充套件,也可以使用第三方的Logger內建的Log Providers
內建的Log Providers
• Console
• Debug
• EventSource
• EventLog
• TraceSource
• Azure App Service
Log等級:
•Trace
•Debug
•Information
•Warning
•Error
•Critical
在進行記錄日誌的時候,還有一些選項引數,比如,分類,Event Id,格式化字串
程式碼示例
先看一下原始碼,在Program.cs檔案裡對CreateDefaultBuilder進行反編譯,可以看到如下:
可以看到裡邊已經有一些配置好的,如果我們想自己配置的話,可以在外邊呼叫ConfigureLogging這個方法,來手動新增,比如只想要一個Console,如下:
怎麼用Logger呢?比如我需要在HomeController.cs裡使用,如下:
先注入:
public readonly IRepository<Student> _repository;
private readonly HostingEnvironment _hostingEnvironment;
private readonly ILogger<HomeController> _logger;
public HomeController(IRepository<Student> repository,HostingEnvironment hostingEnvironment,ILogger<HomeController> logger )
{
_repository = repository;
_hostingEnvironment = hostingEnvironment;
_logger = logger;
}
然後在Index方法裡使用一下,如下:
先新建一個類,名為MyLogEventIds.cs,如下:
public class MyLogEventIds
{
public const int HomePage = 1000;
}
然後使用:
public IActionResult Index()
{
_logger.LogInformation(MyLogEventIds.HomePage, "visiting home index......");
return View();
}
可以在控制檯看到:
基本格式就是這樣,一共就三部分內容,一個是分類,一個是ID,一個是資訊,有時候資訊裡邊我們要加一些引數,如下:
int id = 10;
_logger.LogInformation(MyLogEventIds.HomePage, "visiting home index {0}", id);
注意:引數形式建議使用佔位符,不建議使用$語法。
再看一下配置檔案裡的Log配置,先看appsettings.json檔案:
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
再看看appsettings.Development.json檔案:
{
"Logging": {
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
}
}
可以表明,Debug級別以上的可以使用Log,一下的就不能了,比如說:
_logger.Trace(MyLogEventIds.HomePage, "visiting home index {0}", id);
這就沒什麼作用了。
第三方Log Provider
• Serilog
• NLog
• EImah
在ASP.Net Core中用的比較多的就是第一個,所以這裡學習一下Serilog,首先安裝Serilog,開啟Nuget,如下:
搜尋Serilog.aspnetcore,如下:
然後搜尋Serilog.sinks,這個有很多,主要是用來將日誌輸出到哪裡,比如,輸出到控制檯,輸出在文字檔案裡等等,如下:
這裡安裝前兩個,可以輸出在控制檯和檔案裡。
然後配置Serilog,在Main方法裡配置:
public static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.Console()
.WriteTo.File(Path.Combine("logs", "log.txt"), rollingInterval: RollingInterval.Day)
.CreateLogger();
CreateWebHostBuilder(args).Build().Run();
}
最小級別是Debug,如果遇到Microsoft這個名稱空間,它的最小級別是Information,下邊兩個WriteTo屬於輸出媒介,可以輸出到控制檯,也可以輸出在log.txt文字檔案裡,rollingInterval: RollingInterval.Day代表每天生成一個檔案,可以修改,比如每分鐘Minute,下邊測試就使用Minute
然後使用:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseSerilog()
.UseStartup<Startup>();
啟動專案,開啟控制檯:
可以看到,顏色都變了。再看一下目錄:
裡邊就是輸出的日誌詳情。