VEC系列-Serilog封装到程序

VEC系列之【Serilog 保姆级教程】

相关NuGet包介绍

Serilog.Extensions.Loggingserilog核心,必要
Serilog.Sinks.Async支持异步记录日志,很有必要
Serilog.Sinks.File支持保存到本地,很有必要
Serilog.Sinks.MSSqlServer支持保存到数据库,有必要的,自带的,比较简单配置
Serilog.Sinks.Console支持输出到控制台,略有必要(一般可以直接Console)

注入服务 扩展方法

使用Serilog或者其他组件,Core程序避免不了的就是将其注入到服务中去。日志服务要在构建程序之前就要用Serilog来代替默认自带的ILogger。

        public static IHostBuilder AddSerilogSetup(this IHostBuilder host)
        {
            var logConfiguration = new LoggerConfiguration()
                .MinimumLevel.Debug() //最小记录等级
                .ReadFrom.Configuration(Appsettings.Configuration) //从给定的配置文件读取信息
                .Enrich.FromLogContext()//从上下文中获取信息,自动添加到日志中
                .WriteToConsole()//写出到控制台 
                .WriteToFile()//写出到文件
                .WriteToDataBase();//写出到数据库(项目采用雪花ID,serilog自带的生成日志表是自增int不太符合项目,可根据需求选择)

            Log.Logger = logConfiguration.CreateLogger();

            host.UseSerilog(); //设置Serilog为日志提供者
            return host;
        }

写出到控制台的扩展方法WriteToConsole

        public static LoggerConfiguration WriteToConsole(this LoggerConfiguration configuration)
        {
            configuration = configuration.WriteTo.Logger(x =>
            {
                x.Filter.ByExcluding(ExcludingCondition())//过滤掉的内容,我会手动过滤掉不需要的,这个不是必要的。
                .Filter.ByExcluding(a => a.Level == LogEventLevel.Debug)//我自己不输出Debug,因为程序自带的Debug记录太多了
                .WriteTo.Console();
            });
            return configuration;
        }

写出到文件的扩展方法WriteToFile(分别控制日志等级输出到不同的文件分类,按天滚动)

        public static LoggerConfiguration WriteToFile(this LoggerConfiguration configuration)
        {
            //输出INFO日志
            configuration = configuration.WriteTo.Logger(x =>
            {
                x.Filter.ByIncludingOnly(x => x.Level == LogEventLevel.Information)
                .Filter.ByExcluding(ExcludingCondition())
                .WriteTo.Async(s => s.File(LogContextWrite.Combine(@"INFO/.txt"), rollingInterval: RollingInterval.Day, outputTemplate: LogTemplate));
            });
            //输出ERROR日志
            configuration = configuration.WriteTo.Logger(x =>
            {
                x.Filter.ByIncludingOnly(x => x.Level == LogEventLevel.Error)
                .Filter.ByExcluding(ExcludingCondition())
                .WriteTo.Async(s => s.File(LogContextWrite.Combine(@$"ERROR/.txt"), rollingInterval: RollingInterval.Day, outputTemplate: LogTemplate));
            });
            //输出Debug日志
            configuration = configuration.WriteTo.Logger(x =>
            {
                x.Filter.ByIncludingOnly(x => x.Level == LogEventLevel.Debug)
                .Filter.ByExcluding(ExcludingCondition())
                .WriteTo.Async(s => s.File(LogContextWrite.Combine(@"DEBUG/.txt"), rollingInterval: RollingInterval.Day, outputTemplate: LogTemplate));
            });
            //输出Warning日志
            configuration = configuration.WriteTo.Logger(x =>
            {
                x.Filter.ByExcluding(ExcludingCondition())
                .WriteTo.Async(s => s.File(LogContextWrite.Combine(@"WARNING/.txt"), rollingInterval: RollingInterval.Day, outputTemplate: LogTemplate));
            });
            return configuration;
        }

写出到数据库的扩展方法WriteToDataBase

        public static LoggerConfiguration WriteToDataBase(this LoggerConfiguration configuration)
        {
            //读取配置文件是否开启数据库日志记录(会自动建表)
            if (!Appsettings.AppStr("Seq:EnableWriteToDatabase").ObjToBool())
            {
                return configuration;
            }
            //数据库连接字符
            var databaseSettings = Appsettings.App<DatabaseSettings>("DatabaseSettings");
            var defaultDb = databaseSettings.Db.FirstOrDefault(x => x.Name == databaseSettings.DefaultDb);

            configuration = configuration.WriteTo.Logger(x =>
            {
                //只记录Error,其他的没必要入库。
                x.Filter.ByExcluding(l => l.Level != LogEventLevel.Error)
                .Filter.ByExcluding(Matching.FromSource("Microsoft"))//过滤掉微软自带的一些日志
                .Filter.ByExcluding(ExcludingCondition())
                .Filter.ByExcluding(l => l.Properties.ContainsKey("SourceContext") && l.Properties["SourceContext"].ToString().Contains("Quartz.")) // 根据 SourceContext 过滤
                .WriteTo.MSSqlServer(defaultDb.ConnectionString, new MSSqlServerSinkOptions
                {
                    AutoCreateSqlTable = true, //自动建表
                    TableName = Appsettings.AppStr("Seq:WriteToDataBaseTable"),  //表名
                });
            });
            return configuration;
        }

使用

            builder.Host.AddSerilogSetup();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值