Asp.Net Core Serilog日志自定义Sink

项目的日志框架使用了Serilog,现在有需求要将异常日志记录一份到数据库中。

目前网上可以找到适配各个数据库的Sinkhttps://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();
posted @ 2024-07-25 16:03  傅小灰  阅读(28)  评论(2编辑  收藏  举报