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;}
浙公網安備 33010602011771號