Serilog + SQL Server 分表记录日志
Serilog + SQL Server 动态分表记录日志
当日志量巨大达到百万千万级时,为了便于查询日志,可以用 Serilog 动态将日志分表存储记录。
依赖包
- Serilog.AspNetCore, 6.0.1
- Serilog.Sinks.Map, 1.0.2
- Serilog.Sinks.MSSqlServer, 5.8.0
安装依赖包
Install-Package Serilog.AspNetCore
Install-Package Serilog.Sinks.Map
Install-Package Serilog.Sinks.MSSqlServer
配置 appsettings.json
{
"ConnectionStrings": {
"Default": "Server=.;Database=DB;User ID=sa;Password=123;", //默认数据库连接字符串
},
"Serilog": {
"MinimumLevel": "Information" //日志输出最小级别
}
}
配置 Program.cs
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", true)
.Build(); //读取配置文件
var connectionString = configuration["ConnectionStrings:Default"].Trim(); //获取默认的数据库连接字符串
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration) //读取配置文件中的配置
.WriteTo.Console(theme: AnsiConsoleTheme.Code) //写入控制台输出,且使用 AnsiConsoleTheme.Code 主题
.WriteTo.Map( //动态配置
keyPropertyName: "Name", //键属性名
defaultKey: "0", //默认键值
configure: (name, wt) => wt.Logger(lc => lc //配置单个log
.WriteTo.MSSqlServer( //写入MSSQL
connectionString: connectionString, //使用默认的数据库连接字符串
sinkOptions: new MSSqlServerSinkOptions
{
TableName = $"LogEvents_{name}", //动态表名
AutoCreateSqlTable = true //自动创建表
})))
.CreateLogger(); //创建log
Log.Information("Host created."); //使用默认键值输出日志到数据库,表名为 LogEvents_0
Log.ForContext("Name", "1").Information("1"); //使用动态键值输出日志到数据库,表名为 LogEvents_1