如何在 ASP.Net Core 中使用 Serilog

記錄日誌的一個作用就是方便對應用程序進行跟蹤和排錯調查,在實際應用上都是引入 日誌框架,但如果你的 日誌文件 包含非結構化的數據,那麼查詢起來將是一個噩夢,所以需要在記錄日誌的時候採用結構化方式。

將日誌結構化可以更容易的查詢和分析,做法就是在寫入的時候定義好數據的格式,這種格式包括:xml,json,或者你希望轉成的任何結構。

Serilog 是一個第三方,開源的結構化日誌框架,它的高層封裝可以讓開發者更容易的將日誌記錄到 console,file 和你能想到的各種 存儲系統,這篇文章我們將會討論如何在 ASP.Net Core 中使用 Serilog。

安裝 Serilog

使用 Visual Studio 新建 ASP.Net Core 項目,接下來從 NuGet 上拉幾個包,具體如下:

  • Serilog

這個包提供了對基本的結構化日誌的功能支持。

  • Serilog.AspNetCore

這個包提供了 Serilog 對 AspNetCore 的支持。

  • Serilog.Settings.Configuration

這個包打通了 Serilog 和 Configuration ,這樣你就可以直接從 appsettings.json 中讀取配置。

  • Serilog.Sinks.Console

Console接收器顧名思義就是將 Serilog 的日誌輸出到 Console。

  • Serilog.Sinks.RollingFile

實現了對 滾動文件 的支持。

使用 Serilog Sink

Serilog 利用 sink 特性將日誌送到不同的地方,比如:text文件,數據庫,甚至是 ElasticSearch 中,換句話說,sink 特性可以把日誌送到它該去的地方,當所有的 nuget 包都安裝好了之後,下面的代碼片段展示瞭如何將日誌送到 console 中。


        public HomeController(ILogger<HomeController> logger)
        {
            using (var logConfig = new LoggerConfiguration().WriteTo.Console().CreateLogger())
            {
                logConfig.Information("This is a test data.");
            };

            _logger = logger;
        }

值得注意的是,Serilog 支持多個日誌級別,如:verbose, debug, information, warning, error 和 fatal。

有時候爲了調試目的,將日誌送到 Console 是一個好辦法,但將程序部署到生產之後,更通用的做法就是將日誌記錄到文件中,這樣方便在生產上實時查看並做一定程度的日誌分析,剛好這裏的 Serilog.Sink.RollingFile 支持對滾動文件的支持,下面的代碼片段展示瞭如何通過編程的方式將日誌送到文件中。


        public HomeController()
        {
            var logger = new LoggerConfiguration().MinimumLevel.Debug().WriteTo
                                                  .RollingFile(@"e:\log.txt", retainedFileCountLimit: 7)
                                                  .CreateLogger();

            for (int i = 0; i < byte.MaxValue; i++)
            {
                logger.Information($"log {i}");
            }
        }

使用 Serilog 替換原生的 Logger

在 ASP.NET Core 中內置了 Logger 組件,這一節中我們一起看看如何使用 Serilog 將其進行替換,在 Program.Main 方法中使用如下代碼:


    public class Program
    {
        public static void Main(string[] args)
        {
            Log.Logger = new LoggerConfiguration()
             .MinimumLevel.Debug()
             .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
             .Enrich.FromLogContext()
             .WriteTo.Console()
             .CreateLogger();

            try
            {
                Log.Information("Starting web host");
                CreateHostBuilder(args).Build().Run();
            }
            catch (Exception ex)
            {
                Log.Fatal(ex, "Host terminated unexpectedly");
            }
            finally
            {
                Log.CloseAndFlush();
            }
        }

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


從上面的代碼中可以看到,我在 CreateHostBuilder 中使用了 UseSerilog() 擴展方法來啓動 Serilog,這樣就做好了 Serilog 的替換工作,接下來可以在 Controller 中通過依賴注入的方式獲取 logger 實例,如下代碼所示:


        public IActionResult Index()
        {
            logger.LogInformation("hello world");

            return View();
        }

日誌是一個應用程序不可或缺的一部分,所以選擇一款 靈活 + 簡單 的日誌框架就顯得特別重要了,Serilog 提供了低配置和易使用的特性讓我們方便的將日誌送到各個地方。

譯文鏈接:https://www.infoworld.com/article/3314985/how-to-use-serilog-in-aspnet-core.html


本文分享自微信公衆號 - 一線碼農聊技術(dotnetfly)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章