開發與維運

.NET 雲原生架構師訓練營(模塊二 基礎鞏固 日誌)–學習筆記

2.2.2 核心模塊--日誌

  • ILogger 的使用
  • 日誌的 ID
  • 日誌的分類
  • 日誌的級別
  • LoggerProvider
  • 日誌的最佳實踐

.NET Core 和 ASP.NET Core 中的日誌記錄:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/logging/?view=aspnetcore-5.0

ILogger 的使用

在 Get 方法中添加日誌

WeatherForecastController.cs

private readonly ILogger<WeatherForecastController> _logger;

public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
    _logger = logger;
}

_logger.LogInformation("Get action executed");

日誌的 ID

_logger.LogInformation(new EventId(1001, "Action"), "Get action executed");

日誌的分類

根據不同的類名區分

private readonly ILogger<WeatherForecastController> _logger;
private readonly ILogger _myLogger;

public WeatherForecastController(ILogger<WeatherForecastController> logger, ILoggerFactory loggerFactory)
{
    _logger = loggerFactory.CreateLogger<WeatherForecastController>();
    _myLogger = loggerFactory.CreateLogger("MyLogger");// 通過自己的分類 MyLogger 創建
}

日誌的級別

LogLevel Value Method Description 推薦使用場景
Trace 0 LogTrace 跟蹤日誌:粒度細,非常詳細跟蹤日誌,包括方法的進入結束。一般是用於sdk、或者一些基礎設施上 開發環境/特殊環境
Debug 1 LogDebug 調試日誌:記錄一些比較容易出錯的一些跟蹤信息 開發環境/特殊環境
Information 2 LogInformation 信息:生產級別開啟。相對來說比較重要的節點:比如訂單支付成功、取消成功 生產
Warning 3 LogWarning 警告:有一定錯誤,但不影響結果執行 生產
Error 4 LogError 錯誤:導致程序不能正常往下執行業務的錯誤 生產
Critical 5 LogCritical 致命:記錄信息要求,系統崩潰 生產
None 6

LoggerProvider

源碼:https://github.com/aspnet/Logging/tree/master/src/

ILoggerProvider.cs

using System;

namespace Microsoft.Extensions.Logging
{
    /// <summary>
    /// Represents a type that can create instances of <see cref="ILogger"/>.
    /// </summary>
    public interface ILoggerProvider : IDisposable
    {
        /// <summary>
        /// Creates a new <see cref="ILogger"/> instance.
        /// </summary>
        /// <param name="categoryName">The category name for messages produced by the logger.</param>
        /// <returns></returns>
        ILogger CreateLogger(string categoryName);
    }
}

日誌的設計模式

015.jpg

支持不同類型的日誌輸出,可以自定義一個 LoggerProvider

打印容器中所有注入的 LoggerProvider

Program.cs

var providers = host.Services.GetServices<ILoggerProvider>();// 獲取容器中所有注入的實例
foreach (var provider in providers)
{
    Console.WriteLine(provider.GetType().ToString());
}

啟動程序,輸出如下:

Microsoft.Extensions.Logging.Console.ConsoleLoggerProvider
Microsoft.Extensions.Logging.Debug.DebugLoggerProvider
Microsoft.Extensions.Logging.EventSource.EventSourceLoggerProvider
Microsoft.Extensions.Logging.EventLog.EventLogLoggerProvider

添加,清除

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureLogging((ctx, logger) =>
        {
            //logger.AddProvider();// 添加
            logger.ClearProviders();// 清除
        })

日誌的最佳實踐

先註釋清除代碼

//.ConfigureLogging((ctx, logger) =>
//{
//    //logger.AddProvider();// 添加
//    logger.ClearProviders();// 清除
//})

在 appsettings.json 調整日誌級別為 Trace

{
  "Logging": {
    "LogLevel": {
      "Default": "Trace",
      "Microsoft": "Trace",
      "Microsoft.Hosting.Lifetime": "Trace"
    }
  }
}

在 WeatherForecastController 中添加一個方法,根據需求使用日誌

public IActionResult CreateOrder(dynamic order)
{
    _logger.LogTrace("Enter CreateOrder method");
    
    _logger.LogDebug("Start creating order: {0}", "order info");

    _logger.LogTrace("Start executing _orderService.Create method");

    if (order.amount <= 0)
    {
        _logger.LogWarning("Order Amount is:{0}");
    }

    _orderService.Create(order);
    _logger.LogTrace("Completed executing _orderService.Crete method");

    _logger.LogTrace("Leave CreateOrder Successfully");

    _logger.LogInformation("Leave CreateOrder Successfully");

    return Ok();
}

GitHub源碼鏈接:

https://github.com/MINGSON666/Personal-Learning-Library/tree/main/ArchitectTrainingCamp/HelloApi

Leave a Reply

Your email address will not be published. Required fields are marked *