探索ASP.Net Core 3.0系列六:ASP.NET Core 3.0新特性啟動信息中的結構化日志


前言:在本文中,我將聊聊在ASP.NET Core 3.0中細小的變化——啟動時記錄消息的方式進行小的更改。 現在,ASP.NET Core不再將消息直接記錄到控制台,而是正確使用了logging 基礎結構,來生成結構化日志。

 翻譯: Andrew Lock   https://andrewlock.net/new-in-aspnetcore-3-structured-logging-for-startup-messages/

 

 

探索ASP.NET Core 3.0系列一:新的項目文件、Program.cs和generic host

探索ASP.Net Core 3.0系列二:聊聊ASP.Net Core 3.0 中的Startup.cs

探索 ASP.Net Core 3.0系列三:ASP.Net Core 3.0中的Service provider validation

探索ASP.Net Core 3.0系列四:在ASP.NET Core 3.0的應用中啟動時運行異步任務

探索 ASP.Net Core 3.0系列五:引入IHostLifetime並弄清Generic Host啟動交互

一、ASP.NET Core 2.x中惱人的非結構化日志

當您在ASP.NET Core 2.x中啟動應用程序時,默認情況下,ASP.NET Core會將一些有關您的應用程序的信息輸出到控制台,例如當前環境,內容根路徑以及Kestrel正在監聽的URL。:

 

 這些消息由WebHostBuilder寫入的,目的是為您提供了應用程序的便捷概述,但它直接寫入控制台中。

 

這有兩個主要缺點:

  •  這些有用的信息僅寫入控制台,因此不會寫入任何其他日志記錄基礎結構。
  • 寫入控制台的消息是非結構化的,它們的格式將與寫入控制台的任何其他日志不同。 他們甚至沒有日志級別或源。

最后一點特別煩人,因為在Docker中運行時通常將結構化日志寫入標准輸出(控制台),然后讓另一個進程讀取這些日志並將其發送到中央位置(例如使用fluentd),這很常見。

 

幸運的是,在ASP.NET Core 2.1中,有一種方法可以使用環境變量禁用這些消息,如我在上一篇文章中所展示的。 唯一的缺點是消息被完全禁用,因此根本不會記錄任何方便的信息,詳細請參考這邊文章:

https://andrewlock.net/suppressing-the-startup-and-shutdown-messages-in-asp-net-core/

 

幸運的是,ASP.NET Core 3.0中的微小變化為我們提供了兩全其美的方法!

 

二、在ASP.NET Core 3.0中正確記錄日志

如果使用dotnet run啟動ASP.NET Core 3.0應用程序,您會注意到寫入控制台的日志消息中的細微差別:

 

 現在,使用結構化日志記錄啟動消息! 但是並不像使用Logger替代Console那樣簡單。 在ASP.NET Core 2.x中,由WebHost負責記錄這些消息。 在ASP.NET Core 3.0中,這些消息由ConsoleLifetime記錄,ConsoleLifetime是通用主機注冊的默認IHostLifetime。

我在上一篇文章中描述了IhostLifetime(尤其是ConsoleLifetime)的作用,但總而言之,該類負責偵聽控制台中的Ctrl + C按鍵,並啟動關閉過程。

ConsoleLifetime還在其WaitForStartAsync()方法期間注冊回調,這些回調在觸發ApplicationLifetime.ApplicationStarted事件以及觸發ApplicationLifetime.ApplicationStopping事件時調用:

public Task WaitForStartAsync(CancellationToken cancellationToken)
{
    if (!Options.SuppressStatusMessages)
    {
        // Register the callbacks for ApplicationStarted
        _applicationStartedRegistration = ApplicationLifetime.ApplicationStarted.Register(state =>
        {
            ((ConsoleLifetime)state).OnApplicationStarted();
        },
        this);

        // Register the callbacks for ApplicationStopping
        _applicationStoppingRegistration = ApplicationLifetime.ApplicationStopping.Register(state =>
        {
            ((ConsoleLifetime)state).OnApplicationStopping();
        },
        this);
    }

    // ...

    return Task.CompletedTask;
}

這些回調運行簡單地寫入日志記錄基礎結構的OnApplicationStarted()和OnApplicationStopping()方法(如下所示):

private void OnApplicationStarted()
{
    Logger.LogInformation("Application started. Press Ctrl+C to shut down.");
    Logger.LogInformation("Hosting environment: {envName}", Environment.EnvironmentName);
    Logger.LogInformation("Content root path: {contentRoot}", Environment.ContentRootPath);
}

private void OnApplicationStopping()
{
    Logger.LogInformation("Application is shutting down...");
}

盡管確切的消息略有不同,但是System Lifetime和Windows ServiceLifetime實現使用相同的方法通過標准日志記錄基礎結構來寫入日志文件。

 

三、使用ConsoleLifetime抑制啟動消息

ConsoleLifetime創建的啟動消息引起的一個令人驚訝的變化是,您將無法再按照我在上一篇文章中描述的方式隱藏消息。 設置ASPNETCORE_SUPPRESSSTATUSMESSAGES顯然沒有任何效果-無論是否設置了環境變量,消息都將繼續記錄!

正如我已經指出的那樣,由於使用Microsoft.Extensions.Logging基礎結構正確記錄了消息,因此這現在並不是什么大問題。 但是,如果這些消息由於某種原因冒犯了您,並且您真的想擺脫它們,則可以在Startup.cs中配置ConsoleLifetimeOptions:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // ... other configuration
        services.Configure<ConsoleLifetimeOptions>(opts => opts.SuppressStatusMessages = true);
    }
}

 

 

 現在只顯示結構化的日志信息了。

如果需要,您甚至可以根據ASPNETCORE_SUPPRESSSTATUSMESSAGES環境變量的存在來設置SuppressStatusMessages字段:

public class Startup
{
    public IConfiguration Configuration { get; }

    public Startup(IConfiguration configuration) => Configuration = configuration;

    public void ConfigureServices(IServiceCollection services)
    {
        // ... other configuration
        services.Configure<ConsoleLifetimeOptions>(opts 
                => opts.SuppressStatusMessages = Configuration["SuppressStatusMessages"] != null);
    }
}

如果您確實選擇不顯示消息,請注意,Kestrel仍會記錄其正在監聽的URL;否則,您將保留其記錄。 沒有辦法抑制這些:

info: Microsoft.Hosting.Lifetime[0]
      Now listening on: http://0.0.0.0:5000
info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://0.0.0.0:5001

四、總結

在本文中,我展示了如何在3.0中記錄結構化日志,避免在ASP.NET Core 2.x應用程序啟動時煩人的非結構化日志。 這樣可以確保將日志寫入所有已配置的記錄器,並且在寫入控制台時具有標准格式。 我在日志消息中描述了IhostLifetime的角色,並說明了如何配置ConsoleLifetimeOptions以根據需要禁止顯示狀態消息。

 

好了,這個系列 的文章就到此結束,后面我會再補充6篇文章,該系列就完全結束了,剩下的 就是繼續搞秒殺項目(ASP.Net Core )的CI/CD,爭取 年前能搞定吧。

 

翻譯: Andrew Lock   https://andrewlock.net/new-in-aspnetcore-3-structured-logging-for-startup-messages/

 

作者:郭崢

出處:http://www.cnblogs.com/runningsmallguo/

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM