记录日志是应用程序的一个基本功能点,日志对于发现,排查,调试bug的时候特别有用,Serilog
是一个第三方开源的类库,它可以将日志结构化的输出到控制台,文件 以及 若干个其他类别的数据存储中。
本篇主要讨论如何通过 Serilog 将结构化的日志写入到 Sql Server 中,要想运行本篇中的例子,你需要安装一下 Visual Studio 2019。
安装 Serilog
要把 Serilog 用起来,需要通过 NuGet 去安装,有两种方式可以选择,要么使用 VS 中的 NuGet package manager
可视化界面,要么在 NuGet package manager console
命令行窗口中键入如下命令。
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 默认的日志框架。
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseSerilog()
.Build();
搭建一个测试 web程序
为了在应用程序中展示 Serilog 的用法,下面是完整的代码段,可以着重看一下我们是如何配置和构建 webhost 的。
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
配置。
{
"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表,当然你也可以手工的在数据库中生成日志表,如果要这么做的话,可以使用下面的脚本。
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