如何在 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
相关文章
相关标签/搜索