<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      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 2025-02-19 15:24  嘗嘗手指  閱讀(62)  評論(0)    收藏  舉報

      主站蜘蛛池模板: www插插插无码免费视频网站| 国产不卡一区不卡二区| 精品国产伦理国产无遮挡| 欧美性69式xxxx护士| 久久精品午夜视频| 日本高清不卡一区二区三| 无码人妻丰满熟妇区bbbbxxxx| 亚洲国产成人综合自在线| 99精品国产中文字幕| 深夜精品免费在线观看| 厨房与子乱在线观看| 亚洲欧洲日韩国内精品| 精品激情视频一区二区三区| 亚洲国产成人无码影片在线播放| 成人一区二区三区在线午夜| 免费看国产精品3a黄的视频| 在线观看中文字幕国产码| 99riav国产精品视频| 欧美成人h精品网站| 欧美在线精品一区二区三区| 人妻系列无码专区免费| 成人精品色一区二区三区| 在线观看特色大片免费网站| 亚洲成人av一区免费看| 亚洲特黄色片一区二区三区 | 少妇办公室好紧好爽再浪一点| 天堂国产一区二区三区四区不卡| 玩弄放荡人妻少妇系列| 亚洲国产精品老熟女乱码| 日本亚洲一区二区精品久久| 最近中文字幕国产精选| 亚洲午夜精品国产电影在线观看| 男女无遮挡激情视频| 精品91在线| 欧美zoozzooz性欧美| 国产成人精品一区二区秒拍1o| 色老头在线一区二区三区| 亚洲成av人片在线观看www| 中文字幕国产原创国产| 日本激情久久精品人妻热| 久久精品夜色噜噜亚洲aa|