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;}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)