如何在 Asp.Net Core 中將日誌記錄到 SQL Server

譯文連接: https://www.infoworld.com/art...

記錄日誌是應用程序的一個基本功能點,日誌對於發現,排查,調試bug的時候特別有用,Serilog 是一個第三方開源的類庫,它能夠將日誌結構化的輸出到控制檯,文件 以及 若干個其餘類別的數據存儲中。html

本篇主要討論如何經過 Serilog 將結構化的日誌寫入到 Sql Server 中,要想運行本篇中的例子,你須要安裝一下 Visual Studio 2019。git

安裝 Serilog

要把 Serilog 用起來,須要經過 NuGet 去安裝,有兩種方式能夠選擇,要麼使用 VS 中的 NuGet package manager 可視化界面,要麼在 NuGet package manager console 命令行窗口中鍵入以下命令。github

Install-Package Serilog
Install-Package Serilog.AspNetCore
Install-Package Serilog.Sinks.MSSqlServer
Install-Package Serilog.Settings.Configuration

初始化 Serilog

下面的代碼展現瞭如何將 Serilog 添加到 ASP.NET Core 中,能夠着重看一下使用 UseSerilog() 擴展方法將 Serilog 做爲 ASP.NET Core 默認的日誌框架。web

public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                   .UseStartup<Startup>()
                   .UseSerilog()
                   .Build();

搭建一個測試 web程序

爲了在應用程序中展現 Serilog 的用法,下面是完整的代碼段,能夠着重看一下咱們是如何配置和構建 webhost 的。sql

public class Program
    {
        public static void Main(string[] args)
        {
            IConfigurationRoot configuration = new
            ConfigurationBuilder().AddJsonFile("appsettings.json",
            optional: false, reloadOnChange: true).Build();
            Log.Logger = new LoggerConfiguration().ReadFrom.Configuration
            (configuration).CreateLogger();
            BuildWebHost(args).Run();
        }
        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .UseSerilog()
                .Build();
    }

爲了讓 UseSerilog() 可用,記得要引用一下 Serilog 命名空間。數據庫

using Serilog;

配置數據庫鏈接

當用 Visual Studio 建立好 ASP.NET Core 項目時,appsettings.json 文件默認就建立好了,這個文件很重要,後續的數據庫鏈接串和其餘的一些配置信息都會在這裏配置,下面是完整的 appsettings.json 配置。json

{
  "Serilog": {
    "MinimumLevel": "Information",
    "WriteTo": [
      {
        "Name": "MSSqlServer",
        "Args": {
          "connectionString": "Data Source=LAPTOP-ULJMOJQ5;Initial
           Catalog=Research;    
     User Id=joydip; Password=sa123#;",
          "tableName": "Log",
          "autoCreateSqlTable": true
        }
      }
    ]
  }
}

使用 SQL Server 建立日誌表

應用程序會自動的生成table表,固然你也能夠手工的在數據庫中生成日誌表,若是要這麼作的話,可使用下面的腳本。app

CREATE TABLE [Log] (
   [Id] int IDENTITY(1,1) NOT NULL,
   [Message] nvarchar(max) NULL,
   [MessageTemplate] nvarchar(max) NULL,
   [Level] nvarchar(max) NULL,
   [TimeStamp] datetimeoffset(7) NOT NULL,
   [Exception] nvarchar(max) NULL,
   [Properties] nvarchar(max) NULL
   CONSTRAINT [PK_Log]
     PRIMARY KEY CLUSTERED ([Id] ASC)
   )

當應用程序運行後,數據庫會生成一張 Log 表,同時 ASP.NET Core 會將日誌記錄到該表中,下面展現了已經被記錄到 log 表的日誌信息。框架

在 action 中記錄日誌

你可使用 依賴注入(DI) 的方式將 log實例注入到 Controller 中,以下代碼所示:測試

public class DefaultController : Controller
{
   private readonly ILogger<DefaultController> _logger;
   public DefaultController(ILogger<DefaultController> logger)
   {
      _logger = logger;
   }
}

下面的代碼片斷展現瞭如何利用 Serilog 在 Controller 下的 Action 中記錄日誌。

public class DefaultController : Controller
    {
        private readonly ILogger<DefaultController> _logger;
        public DefaultController(ILogger<DefaultController> logger)
        {
            _logger = logger;
        }
        public IActionResult Index()
        {
            _logger.LogInformation("Hello World");
            return View();
        }
    }

雖然 Serilog 是獨立於 .NET Core,而且它是以插件的形式完美的介入到 ASP.NET Core 生態系統中,讓結構化的日誌更加容易,方便的被記錄,Serilog 能夠利用幾十種接收器將日誌發送到不一樣的 target 中,這些 target 包括:文本文件,數據庫,AWS,Azure 和 Google Could Service ,在這篇,我已經展現過了 Serilog 如何和 SQLServer 一塊兒協做,我將會在後續的文章中討論 Serilog 的更多高級特性。

更多高質量乾貨:參見個人 GitHub: dotnetfly
相關文章
相關標籤/搜索