Net Core 3.0 使用 Serilog 把日志记录到 SqlServer
Serilog简介
Serilog是.net中的诊断日志库,可以在所有的.net平台上面运行。Serilog支持结构化日志记录,对复杂、分布式、异步应用程序的支持非常出色。Serilog可以通过插件的方式把日志写入到各种终端,控制台、文本、Sqlserver、ElasticSearch,Serilog支持终端的列表:https://github.com/serilog/serilog/wiki/Provided-Sinks 。
Serilog日志写入SqlServer
一、Sink LoggerConfiguration
connectionString 数据库连接字符串
schemaName 数据库所有者,默认dbo
tableName 记录日志的表名
autoCreateSqlTable 是否自动创建表,如果设置为ture,则在Serilog启动时检测数据库是否有对应的表,没有则创建
columnOptions 日志表中的列定义
restrictedToMinimumLevel 记录日志的最小level
batchPostingLimit 单次批量处理中提交的最大日志数量
period 进行批量提交的间隔
formatProvider 提供特定的格式化处理,https://github.com/serilog/serilog/wiki/Formatting-Output#format-providers
Serilog为我们定义了一套标准列,默认情况下会生成如下列,当然我们也可以自定义列
StandardColumn.Id 自增Id
StandardColumn.Message 日志内容
StandardColumn.MessageTemplate 日志模板
StandardColumn.Level 等级
StandardColumn.TimeStamp 记录时间
StandardColumn.Exception 异常信息
StandardColumn.Properties 日志事件属性值
删除标准列:
columnOptions.Store.Remove(StandardColumn.MessageTemplate);
添加自定义列:
columnOptions.AdditionalColumns = new Collection<SqlColumn> { new SqlColumn { DataType = SqlDbType.NVarChar, DataLength = 32, ColumnName = "IP" } };
完整LoggerConfiguration示例如下:
var columnOptions = new ColumnOptions(); columnOptions.Store.Remove(StandardColumn.MessageTemplate);//删除标准列 columnOptions.Properties.ExcludeAdditionalProperties = true;//排除已经自定义列的数据 columnOptions.AdditionalColumns = new Collection<SqlColumn>//添加自定义列 { new SqlColumn { DataType = SqlDbType.NVarChar, DataLength = 32, ColumnName = "IP" } }; Log.Logger = new LoggerConfiguration() .WriteTo.MSSqlServer( connectionString: Configuration["Serilog:ConnectionString"], tableName: Configuration["Serilog:TableName"], batchPostingLimit: Configuration.GetValue<int>("Serilog:BatchPostingLimit"),//批量插入数据库条数 period: TimeSpan.FromSeconds(5),//执行时间间隔 restrictedToMinimumLevel: Configuration.GetValue<LogEventLevel>("Serilog:MinimumLevel"), columnOptions: columnOptions, autoCreateSqlTable: true ).CreateLogger();
上面的配置也可以全部从配置文件读取:
<