不要用第三方紀錄檔包了Microsoft.Extensions.Logging功能就很強大

2023-12-05 21:00:44

在.NET中,
Microsoft.Extensions.Logging是一個廣泛使用的紀錄檔庫,用於記錄應用程式的紀錄檔資訊。它提供了豐富的功能和靈活性,使開發人員能夠輕鬆地記錄各種型別的紀錄檔,並將其輸出到不同的目標,包括紀錄檔檔案。本文將詳細介紹Microsoft.Extensions.Logging的各種基礎功能以及如何按天生成紀錄檔檔案。

一、Microsoft.Extensions.Logging基礎功能

1. 建立Logger

首先,我們需要建立一個Logger範例,以便在應用程式中記錄紀錄檔。以下是建立Logger的基本方法:

using Microsoft.Extensions.Logging;

var loggerFactory = LoggerFactory.Create(builder =>
{
    builder.AddConsole(); // 輸出紀錄檔到控制檯
});

var logger = loggerFactory.CreateLogger<Program>();

在上面的範例中,我們首先建立了一個LoggerFactory範例,然後通過它建立了一個Logger。我們還使用AddConsole方法將紀錄檔輸出到控制檯。

2. 記錄紀錄檔訊息

一旦有Logger範例,我們可以使用它來記錄不同級別的紀錄檔訊息。
Microsoft.Extensions.Logging定義了以下紀錄檔級別(按嚴重性遞增排列):

  • Trace
  • Debug
  • Information
  • Warning
  • Error
  • Critical

下面是如何使用Logger記錄不同級別的紀錄檔訊息的範例:

logger.LogInformation("這是一條資訊紀錄檔");
logger.LogWarning("這是一條警告紀錄檔");
logger.LogError("這是一條錯誤紀錄檔");
logger.LogCritical("這是一條嚴重錯誤紀錄檔");

3. 提供上下文資訊

通常,我們需要將一些上下文資訊記錄到紀錄檔中,以幫助排查問題。可以使用LogInformation等方法的過載版本,傳遞額外的引數,如下:

var userId = 123;
logger.LogInformation("使用者 {UserId} 登入成功", userId);

在上述範例中,我們將userId作為引數傳遞給紀錄檔訊息,以便將其包含在紀錄檔中。

4. 使用紀錄檔範圍

有時,我們希望在一段程式碼塊中記錄一組相關紀錄檔訊息,並希望這些訊息具有相同的上下文資訊。這時可以使用LogScope,如下所示:

using (logger.BeginScope("交易處理 - 訂單 {OrderId}", orderId))
{
    logger.LogInformation("訂單處理中...");
    // 執行一些訂單處理邏輯
    logger.LogInformation("訂單處理完成");
}

在上述範例中,我們使用BeginScope方法建立了一個紀錄檔範圍,將其包含在指定的上下文資訊中。在範圍內的所有紀錄檔訊息都會自動包含這些上下文資訊。

5. 設定紀錄檔級別

我們可以在應用程式中設定所需的最低紀錄檔級別,以決定哪些紀錄檔訊息將被記錄。通常,這是在應用程式的組態檔中完成的。以下是一個範例:

var loggerFactory = LoggerFactory.Create(builder =>
{
    builder.AddConsole();
    builder.SetMinimumLevel(LogLevel.Information); // 設定最低紀錄檔級別
});

在上述範例中,我們使用SetMinimumLevel方法來設定最低紀錄檔級別。只有達到或高於指定級別的紀錄檔訊息才會被記錄。

二、按天生成紀錄檔檔案

現在,讓我們來看看如何按天生成紀錄檔檔案。通常,我們會希望將紀錄檔訊息記錄到檔案中,並按日期對紀錄檔檔案進行歸檔。

1. 安裝相關包

首先,我們需要安裝一些必要的包,以便實現按天生成紀錄檔檔案。使用NuGet包管理器或.NET CLI可以輕鬆完成這一步驟:

dotnet add package Karambolo.Extensions.Logging.File

2. 組態檔紀錄檔提供程式

接下來,我們需要組態檔紀錄檔提供程式,以便將紀錄檔訊息記錄到檔案中。以下是如何組態檔提供程式的範例:

var loggerFactory = LoggerFactory.Create(builder =>
{
    builder.AddFile("logs/myapp-{Date}.txt");
    builder.SetMinimumLevel(LogLevel.Information);
});

在上述範例中,我們使用AddFile方法組態檔紀錄檔提供程式,並指定紀錄檔檔案的名稱模式。{Date}將根據紀錄檔訊息的日期自動替換為實際日期。

3. 範例程式碼

以下是一個完整的範例程式碼,演示瞭如何使用
Microsoft.Extensions.Logging按天生成紀錄檔檔案:

using System;
using Microsoft.Extensions.Logging;
using Karambolo.Extensions.Logging.File;

class Program
{
    static void Main()
    {
        var loggerFactory = LoggerFactory.Create(builder =>
        {
            builder.AddFile("logs/myapp-{Date}.txt");
            builder.SetMinimumLevel(LogLevel.Information);
        });

        var logger = loggerFactory.CreateLogger<Program>();

        for (int i = 0; i < 10; i++)
        {
            logger.LogInformation("這是一條資訊紀錄檔 - {LogCount}", i);
        }
    }
}

上述範例中,我們設定了檔案紀錄檔提供程式,紀錄檔檔案的名稱模式包含了{Date},並回圈記錄了10條紀錄檔訊息。每天,紀錄檔檔案將被歸檔到不同的檔案中,以便跟蹤和檢查以前的紀錄檔。


Microsoft.Extensions.Logging是.NET中強大的紀錄檔庫,可以用於記錄各種型別的紀錄檔訊息。通過組態檔紀錄檔提供程式,我們可以按天生成紀錄檔檔案,以便更好地管理和分析紀錄檔。