欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ASP.NET Core擴(kuò)展庫之日志功能的使用詳解

 更新時間:2021年03月12日 10:57:25   作者:xfrog  
這篇文章主要介紹了ASP.NET Core擴(kuò)展庫之日志功能的使用詳解,幫助大家更好的理解和學(xué)習(xí)使用.NET技術(shù),感興趣的朋友可以了解下

    上一篇我們對Xfrogcn.AspNetCore.Extensions擴(kuò)展庫功能進(jìn)行了簡單的介紹,從這一篇文章開始,我將逐步介紹擴(kuò)展庫中的核心功能。
    日志作為非業(yè)務(wù)的通用領(lǐng)域基礎(chǔ)功能,有非常多的技術(shù)實現(xiàn),這些第三方庫避免了我們花費時間去重復(fù)實現(xiàn),不過,很多日志庫配置復(fù)雜,不易于使用,入手較難,而有些庫可能與ASP.NET Core的結(jié)合并不好。
    如果我們沒有對所使用的日志庫進(jìn)行詳細(xì)了解,日志庫也可能產(chǎn)生嚴(yán)重的問題,在我的開發(fā)生涯中,曾經(jīng)遇到過多次因為日志庫而導(dǎo)致的生產(chǎn)事故。
    擴(kuò)展庫日志模塊致力于將日志相關(guān)的最佳實踐進(jìn)行封裝,簡化日志庫的使用,讓我們真正從非業(yè)務(wù)代碼中解放出來。

一、簡介 

  ASP.NET Core擴(kuò)展庫中日志功能是對Serilog的進(jìn)一步封裝,之所以選擇Serilog,源于我們在開發(fā)工程中的實踐,我們的日志庫經(jīng)歷了自己開發(fā)、選擇使用NLog,最后定格在使用Serilog庫上。
    Serilog日志庫也并不是非常易于使用,而且可能也缺少一些必要功能,這就是我們需要進(jìn)一步封裝的原因。
    日志功能默認(rèn)提供了Console及File兩種日志目標(biāo),他們都分別支持文本和Json格式。
    我們也添加了日志的分類、日志記錄層級的動態(tài)修改、本地文件日志的定時清理、本地日志文件的按目錄存儲、對容器化下EFK日志架構(gòu)的支持、以及日志在測試中的支持功能等。

二、使用

    日志庫是隨著擴(kuò)展庫一起啟用的,最簡單的情況是啟用擴(kuò)展庫即可,默認(rèn)配置將開啟文件日志目標(biāo),日志存入應(yīng)用下Logs目錄,以日期為文件夾,以日志名稱為文件名稱。
    開啟擴(kuò)展庫有兩種方式,可以在IHostBuilder上通過UseExtensions方法,或者在Startup啟動類ConfigureServices方法中通過IServiceCollection的AddExtensions方法。

// 通過IHostBuilder上的UseExtensions方法
  // Program.cs .NET 5.0 
  public class Program
  {
    public static void Main(string[] args)
    {
      CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
      Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
          webBuilder.UseExtensions(args);
          webBuilder.UseStartup<Startup>();
        });
  }

或者:

// 在Startup類中
  public class Startup
  {

    public void ConfigureServices(IServiceCollection services)
    {
      services.AddExtensions(Configuration);
    }
  }

三、配置

    日志的配置可以通過代碼方式或者通過配置文件方式。
    采用代碼方式,在UseExtensions方法或者AddExtensions中傳入配置對象委托即可:

public static IHostBuilder CreateHostBuilder(string[] args) =>
      Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
          webBuilder.UseExtensions(args, config=>
          {
            config.AppLogLevel = Serilog.Events.LogEventLevel.Verbose;
            config.SystemLogLevel = Serilog.Events.LogEventLevel.Verbose;
          });
          webBuilder.UseStartup<Startup>();
        });

如果采用配置文件方式,只需在配置源(如appsettings.json)中設(shè)置相關(guān)的配置字段:

{
 "AppLogLevel": "Verbose",
 "AllowedHosts": "*"
}

    如果都采用,代碼方式將會覆蓋配置文件方式。
    除此之外,如果你需要對Serilog配置進(jìn)行更詳細(xì)的控制,那么可以直接在UseExtensions方法或者AddExtensions中傳入Serilog的日志配置委托。此項委托的設(shè)置將覆蓋上述的自動配置。

四、配置日志級別

    為了簡化配置,在擴(kuò)展庫中,我們根據(jù)日志名稱將日志分為系統(tǒng)日志、應(yīng)用日志以及EFCore日志,他們分別通過配置中的AppLogLevel、SystemLogLevel及EFCoreCommandLevel屬性來控制。日志級別的配置都支持運行時動態(tài)修改,無需重啟應(yīng)用。

日志分類
對應(yīng)日志名
對應(yīng)配置字段
默認(rèn)級別
系統(tǒng)日志
Microsoft.* 以及 System.*
SystemLogLevel
Warning
EFCore日志
Microsoft.EntityFrameworkCore.Database.Command
EFCoreCommandLevel
Information
應(yīng)用日志
除開系統(tǒng)日志及EFCore日志之外的日志
AppLogLevel
Information

五、日志級別的動態(tài)修改

    如果你是通過配置源來配置的日志級別,那么當(dāng)配置源更新時(一般通過配置對象的Reload方法),日志級別將自動修改。
    如果需要采用代碼方式,你可以通過全局的WebApiConfig實例進(jìn)行配置:

  // 動態(tài)修改日志級別
  var apiConfig = host.Services.GetRequiredService<WebApiConfig>();
  apiConfig.AppLogLevel = Serilog.Events.LogEventLevel.Error;

六、本地文件日志配置

    針對本地日志的配置,包含日志文件的路徑模板、日志文件的定時清理、日志的自動壓縮等。
    本地文件日志路徑通過LogPathTemplate設(shè)置來配置,默認(rèn)為LogPathTemplates.DayFolderAndLoggerNameFile,表示以每天作為子目錄,以日志名稱作為日志文件名。通過LogPathTemplates也內(nèi)置了其他的路徑模板:

路徑模板名
說明
DayFolderAndLoggerNameFile
以每天日期為目錄,日志名稱為文件名
DayFile
以每天日期為日志名稱
LoggerNameAndDayFile
以[日志名稱_每天日志]為日志文件名稱
LevelFile
以日志級別縮寫為日志文件名稱
DayFolderAndLevelFile
以每天日期為目錄,日志級別縮寫為日志名稱

    由于LogPathTemplate為字符串配置,你也可以配置其他的路徑模板。
    關(guān)于日志的定時清理,可以通過MaxLogDays配置來指定日志保留的天數(shù),如果設(shè)置為0,表示不清理,這是默認(rèn)配置。
    通過MaxLogFileSize以及RetainedFileCount配置可以設(shè)置日志文件的自動壓縮策略,MaxLogFileSize默認(rèn)設(shè)置為100mb,超過此大小后,日志將寫到新的文件,RetainedFileCount為可旋轉(zhuǎn)的日志文件數(shù)量,默認(rèn)為31個,超過此數(shù)量后的日志將被自動壓縮。

七、容器化支持

    在容器化環(huán)境下,日志一般會采用EFK的架構(gòu),在k8s中,我們推薦F采用fluent-bit而不是filebeat。這種框架下,我們只需將日志輸出到控制臺,容器將控制臺輸出定位到Docker宿主機(jī),然后通過fluent-bit掃描日志文件,進(jìn)行解析處理,發(fā)送給ES。
    在這種模式下,你需要將ConsoleJsonLog設(shè)置為true來開啟JSON格式的控制臺日志目標(biāo)。同時,由于控制臺單行字?jǐn)?shù)有限制,可能導(dǎo)致日志被截取,故可能需要通過MaxLogLength來設(shè)置單條日志的長度限制,此設(shè)置默認(rèn)為8kb,適合大多數(shù)場景。超出長度的日志并不會被忽略,而是會拆分成多條日志,以此來保證日志的完整性。

// 要支持容器化EFK日志模式,一般只需要設(shè)置ConsoleJsonLog為true即可
  public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
      .ConfigureWebHostDefaults(webBuilder =>
      {
        webBuilder.UseExtensions(args, config=>
        {
          config.ConsoleJsonLog = true;
        });
        webBuilder.UseStartup<Startup>();
      });

八、測試支持

    有時我們可能需要在單元測試中檢查日志的輸出,這時,我們可以使用擴(kuò)展庫在ILoggingBuilder上的擴(kuò)展方法來添加測試日志目標(biāo)。隨后,你可以通過IServiceProvider上的GetTestLogContent方法獲取已記錄的日志內(nèi)容列表。

IServiceCollection services = new ServiceCollection()
    .AddExtensions()
    .AddLogging(logBuilder =>
    {
      // 添加測試日志記錄器
      logBuilder.AddTestLogger();
    });
    
  IServiceProvider provider = services.BuildServiceProvider();
  // 獲取日志內(nèi)容
  var logContent = provider.GetTestLogContent();

九、禁用Serilog

    如果你覺得上述所有功能都不太適合你的場景,但是你又需要使用擴(kuò)展庫的其他功能,那怎么辦呢? 非常簡單,你只需要將EnableSerilog設(shè)置為false,即可完全禁用上述日志功能。 

有關(guān)日志的詳細(xì)配置,可參考[文檔]
Xfrogcn.AspNetCore.Extensions地址:[GitHub] [Gitee]

以上就是ASP.NET Core擴(kuò)展庫之日志功能的使用詳解的詳細(xì)內(nèi)容,更多關(guān)于ASP.NET Core擴(kuò)展庫之日志功能的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論