1. 程式人生 > 實用技巧 >ASP.Net Core -- Logging

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>();

啟動專案,開啟控制檯:

可以看到,顏色都變了。再看一下目錄:

裡邊就是輸出的日誌詳情。