随笔 - 57,  文章 - 0,  评论 - 25,  阅读 - 26583
VEC系列之【Serilog 保姆级教程】 

相关NuGet包介绍

Serilog.Extensions.Logging serilog核心,必要
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();

 

 

publicstaticLoggerConfigurationWriteToDataBase(thisLoggerConfiguration 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,newMSSqlServerSinkOptions{ AutoCreateSqlTable =true,//自动建表 TableName = Appsettings.AppStr("Seq:WriteToDataBaseTable"),//表名});});return configuration;}
posted on   尝尝手指  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示