Asp.Net Core Serilog日志自定义Sink
项目的日志框架使用了Serilog
,现在有需求要将异常日志记录一份到数据库中。
目前网上可以找到适配各个数据库的Sink
。https://github.com/serilog/serilog/wiki/Provided-Sinks
但是由于项目需要适配多个不同类型的数据库,故打算自定义一个DatabaseSink
,使用SqlSugar
进行数据库操作。
创建DatabaseSink
这里使用PeriodicBatchingSink
实现批量日志数据写入控制,DatabaseSink
只要继承实现IBatchedLogEventSink
接口即可。
public class DatabaseSink : IBatchedLogEventSink
{
private SqlSugarClient _db;
public DatabaseSink(ConnectionConfig config)
{
_db = new SqlSugarClient(config);
}
public async Task EmitBatchAsync(IEnumerable<LogEvent> batch)
{
var list = batch.Select(d => new SysExceptionLogEntity()
{
Level = d.Level.ToString(),
Message = d.RenderMessage(),
Exception = d.Exception?.ToString(),
CreateTime = DateTime.Now,
}).ToList();
await _db.Insertable(list).ExecuteCommandAsync();
}
public Task OnEmptyBatchAsync()
{
return Task.CompletedTask;
}
}
设置日志批处理参数,日志记录过滤等级
public static LoggerConfiguration DatabaseSink(
this LoggerSinkConfiguration loggerConfiguration,
ConnectionConfig config
)
{
return loggerConfiguration.Sink(new PeriodicBatchingSink(new DatabaseSink(config), new PeriodicBatchingSinkOptions()
{
BatchSizeLimit = 100, // 设置批处理大小
Period = TimeSpan.FromSeconds(5),// 设置批处理时间
}), LogEventLevel.Error);
}
配置DatabaseSink
var conn = builder.Configuration.GetSection("DbConfig").Get<ConnectionConfig>();
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(builder.Configuration)
.WriteTo.DatabaseSink(conn)
.CreateLogger();