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();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2019-07-25 Web Api全局预防Xss攻击
2019-07-25 IIS应用程序池标识(程序池账户)ApplicationPoolIdentify