天天看點

七、.net core(.NET 6)使用Serilog進行配置和實作日志記錄

使用Serilog來實作日志記錄

先安裝Serilog六件套神裝包:

七、.net core(.NET 6)使用Serilog進行配置和實作日志記錄

也可以對個别相應的包進行删除等,都是可以的。例如,标注的1是讀取配置檔案的,如果不需要通過配置檔案進行操作,就可以使用這個包。2是列印到控制台的,如果不需要列印到控制台,也可以不引用。3是寫入到檔案的,如果不需要寫入到檔案,也是可以不提供的。我在此處全部引入,友善可以使用多種日志記錄方法。Async是異步寫入日志,一般需要引入。

我們先在啟動項目的Program類裡面,新增一些對Serilog的支援操作:

七、.net core(.NET 6)使用Serilog進行配置和實作日志記錄
然後,在控制器裡面添加對Logger<T>的依賴注入,并寫一些不同日志等級的日志記錄功能:
七、.net core(.NET 6)使用Serilog進行配置和實作日志記錄
然後啟動項目,并執行一下該api方法,檢視到日志列印的結果:
七、.net core(.NET 6)使用Serilog進行配置和實作日志記錄

由于預設消息記錄級别是Warn,是以debug消息類型就看不見了。

以及寫入文本的日志,由于設定輸出到本目錄,是以可以在解決方案裡面直接看見:

七、.net core(.NET 6)使用Serilog進行配置和實作日志記錄
接下來使用配置檔案的方式進行日志操作:
七、.net core(.NET 6)使用Serilog進行配置和實作日志記錄
本部分serilog配置檔案代碼:
七、.net core(.NET 6)使用Serilog進行配置和實作日志記錄
七、.net core(.NET 6)使用Serilog進行配置和實作日志記錄

"Serilog": {
    "MinimumLevel": {
      "Default": "Debug", //最小日志記錄級别
      "Override": { //系統日志最小記錄級别
        "Default": "Warning",
        "System": "Warning",
        "Microsoft": "Warning"
      }
    },
    "WriteTo": [
      { "Name": "Console" }, //輸出到控制台
      {
        "Name": "Async", //異步寫入日志
        "Args": {
          "configure": [
            {
              "Name": "File", //輸出檔案
              "Args": {
                "path": "log/log.txt",
                "outputTemplate": "{NewLine}Date:{Timestamp:yyyy-MM-dd HH:mm:ss.fff}{NewLine}LogLevel:{Level}{NewLine}Class:{SourceContext}{NewLine}Message:{Message}{NewLine}{Exception}",
                "rollingInterval": "3" //日志檔案生成精度:1:年  2:月 3:日 4:小時
              }
            }
          ]
        }
      }
    ]
  }      

View Code

在Program裡面,注釋掉原先的代碼,然後新增一條通過配置檔案進行讀取的語句:

七、.net core(.NET 6)使用Serilog進行配置和實作日志記錄

因為配置檔案裡面設定的最小預設等級是Debug,是以現在可以全部列印出來:

七、.net core(.NET 6)使用Serilog進行配置和實作日志記錄

配置檔案裡面配置的rollingInterval值為3,代表每天生成;path代表根目錄,設定log/log.txt代表根目錄下的log檔案夾,按照每天(日期)生成的log開頭的txt日志檔案。是以我們可以看見在根目錄下産生了一個日志檔案log20210530.txt:

七、.net core(.NET 6)使用Serilog進行配置和實作日志記錄

以上,代表Serilog通過配置檔案成功。其中,還可以通過配置檔案+啟動項配置兩個打配合進行配置出更适合自己的日志記錄風格,此處不再贅述,歡迎自己嘗試。

另外,Serilog還可以實作seq可視化功能,不過seq是收費的,是以這邊不做示範。也可以通過ElasticSearch+Kibana進行開發,實作日志可視化和日志搜尋引擎功能,該部分功能敬請期待,将來會有這部分教程放出,現在還沒到時候。

 本篇有關源碼:

Program:

七、.net core(.NET 6)使用Serilog進行配置和實作日志記錄
七、.net core(.NET 6)使用Serilog進行配置和實作日志記錄
public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }


        /// <summary>
        /// Serilog日志模闆
        /// </summary>
        static string serilogDebug = System.Environment.CurrentDirectory + "\\Log\\Debug\\.log";
        static string serilogInfo = System.Environment.CurrentDirectory + "\\Log\\Info\\.log";
        static string serilogWarn = System.Environment.CurrentDirectory + "\\Log\\Warning\\.log";
        static string serilogError = System.Environment.CurrentDirectory + "\\Log\\Error\\.log";
        static string serilogFatal = System.Environment.CurrentDirectory + "\\Log\\Fatal\\.log";

        static string SerilogOutputTemplate = "{NewLine}時間:{Timestamp:yyyy-MM-dd HH:mm:ss.fff}{NewLine}日志等級:{Level}{NewLine}所在類:{SourceContext}{NewLine}日志資訊:{Message}{NewLine}{Exception}";

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
             .UseServiceProviderFactory(new AutofacServiceProviderFactory())  // 添加Autofac
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>()
                    .UseUrls("http://*:35678")
                     .UseSerilog((context, logger) =>//注冊Serilog
                     {
                         logger.ReadFrom.Configuration(context.Configuration);
                         logger.Enrich.FromLogContext();

                         //logger.WriteTo.Console();  // 輸出到Console控制台
                         //// 輸出到配置的檔案日志目錄
                         //logger.WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Debug).WriteTo.Async(a => a.File(serilogDebug, rollingInterval: RollingInterval.Hour, outputTemplate: SerilogOutputTemplate)))
                         //    .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Information).WriteTo.Async(a => a.File(serilogInfo, rollingInterval: RollingInterval.Hour, outputTemplate: SerilogOutputTemplate)))
                         //    .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Warning).WriteTo.Async(a => a.File(serilogWarn, rollingInterval: RollingInterval.Hour, outputTemplate: SerilogOutputTemplate)))
                         //    .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Error).WriteTo.Async(a => a.File(serilogError, rollingInterval: RollingInterval.Hour, outputTemplate: SerilogOutputTemplate)))
                         //    .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Fatal).WriteTo.Async(a => a.File(serilogFatal, rollingInterval: RollingInterval.Hour, outputTemplate: SerilogOutputTemplate)));
                     });

                });
    }      

WSKController:

七、.net core(.NET 6)使用Serilog進行配置和實作日志記錄
七、.net core(.NET 6)使用Serilog進行配置和實作日志記錄
[Route("api/[controller]")]
    [ApiController]
    public class WSKController : ControllerBase
    {

        private readonly ITestAutofac _autofac;
        private readonly ILogger<WSKController> _logger;
        public WSKController(ITestAutofac autofac, ILogger<WSKController> logger) {
            _autofac = autofac;
            _logger = logger;
        }

        [HttpPost]
        public IActionResult HelloWorld()
        {
            // _autofac.Test();

            _logger.LogInformation("Info Message……");
            _logger.LogWarning("Warning Message……");
            _logger.LogDebug("Debug Message……");
            _logger.LogError("Error Message……");
            
            return Ok();
        }

     

    }      

最後,如果本文章對君有用,歡迎點贊、評論和打賞~~ 

 版權所有,轉載請注明出處:https://www.cnblogs.com/weskynet/p/14829299.html

歡迎加入QQ群:

群号:1079830632

七、.net core(.NET 6)使用Serilog進行配置和實作日志記錄

繼續閱讀