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 @   傅小灰  阅读(214)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2019-07-25 Web Api全局预防Xss攻击
2019-07-25 IIS应用程序池标识(程序池账户)ApplicationPoolIdentify
点击右上角即可分享
微信分享提示