2019年5月31日 星期五

.NET Core 主控台應用程式的 ILogger 寫入日誌使用練習

.NET Core 主控台應用程式的 ILogger 寫入日誌使用練習

當在開發 .NET Core 主控台類型的應用程式的時候,可以使用 .NET Core 所提供的 Microsoft.Extensions.Logging 套件,並且透過 Microsoft.Extensions.DependencyInjection 套件,使用相依性注入的方式,取得 ILogger 型別的實作物件,就可以進行寫入日誌的工作。因此,在這裡需要先建立一個 .NET Core 主控台應用程式專案,並且在這個專案內加入底下三個 NuGet 套件。
這篇文章中的範例原始碼,可以從 GitHub 取得
Microsoft.Extensions.DependencyInjection
Microsoft.Extensions.Logging
Microsoft.Extensions.Logging.Console
當完成所需要用到的 NuGet 套件之後,就可以建立一個類別,並且在這個類別中,使用建構式注入的方式,將 ILogger 介面所需要用到的實作類別物件注入到建構函式內;而且在該類別中,也設計一個方法 Method,在這個方法內將會使用剛剛使用建構函式注入進來的 ILogger 物件,將需要寫入到日誌的內容,使用 logger.LogInformation("現在正在執行 Method 方法"); 方法寫入。
如此,當透過 .NET Core 的相依性注入容器取得一個 MyClass 實作物件的時候,就會自動產生一個 ILogger 的實作物件,並且可以透過這個 ILogger 物件來進行寫入到日誌的動作了。
C Sharp / C#
class MyClass
{
    private readonly ILogger<MyClass> logger;

    public MyClass(ILogger<MyClass> logger)
    {
        this.logger = logger;
    }
    public void Method()
    {
        logger.LogInformation("現在正在執行 Method 方法");
    }
}
現在,要回到主控台應用程式的進入點,也就是 Main 這個方法,在這個方法內,先要進行 DI 容器的設定,所以,先要建立一個 ServiceCollection 物件,在這裡將會把相關要對於 DI 容器設定的工作,寫在 ConfigureServices 這個方法內;在這個方法裡面,首先使用 AddLogging 方法註冊 Microsoft.Extensions.Logging 服務需要對 Console 做輸出,並且註冊 MyClass 這個類別,因此,只要對這個 DI 容器進行解析 MyClass 類別,就可以產生一個新的類別出來。
完成了 DI 容器的註冊工作,現在可以透過 IServiceCollection.BuildServiceProvider 方法,建立起這個專案要使用的 DI 容器 Container,也就是 IServiceProvider。
當需要使用到 MyClass 類別的物件,就可以透過 IServiceProvider.GetService 方法,注入這個類別的物件,現在,就可以呼叫這個物件的 Method() 方法,此時,螢幕就會出現底下內容。
Press any key for continuing...
info: CoreLogging.MyClass[0]
      現在正在執行 Method 方法
fail: CoreLogging.Program[0]
      Program 類別內發生了意外異常
在上面的第一個日誌輸出,標示著為 CoreLogging.MyClass ,現在,若想要在這個 Program 類別內,也想要寫入一筆紀錄到日誌內,可以使用 var logger = serviceProvider.GetService<ILogger<Program>>(); 敘述,取得日誌物件,接著呼叫 logger.LogError("Program 類別內發生了意外異常"); 方法,就會看到上面輸出的第二個日誌內容,這是一個 fail 的紀錄,並且標示著 CoreLogging.Program
C Sharp / C#
class Program
{
    static void Main(string[] args)
    {
        var serviceCollection = new ServiceCollection();
        ConfigureServices(serviceCollection);

        var serviceProvider = serviceCollection.BuildServiceProvider();

        var myClass = serviceProvider.GetService<MyClass>();

        myClass.Method();

        var logger = serviceProvider.GetService<ILogger<Program>>();
        logger.LogError("Program 類別內發生了意外異常");

        Console.WriteLine("Press any key for continuing...");
        Console.ReadKey();
    }
    private static void ConfigureServices(IServiceCollection services)
    {
        services.AddLogging(configure => configure.AddConsole())
                  .AddTransient<MyClass>();
    }
}




沒有留言:

張貼留言