zoukankan      html  css  js  c++  java
  • .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);
        }
    }
    

    日志的设计模式

    支持不同类型的日志输出,可以自定义一个 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

    知识共享许可协议

    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

    欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

    如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。

  • 相关阅读:
    Delphi DbgridEh实现鼠标拖动选中列,并使复选框选中
    什么是运行期包与设计期包
    组件事件大全
    sql: 查找约束
    delphi Ctrl+鼠标左键或者Find Declaration不能定位到源文件
    delphi7 编译的程序在win7下请求获得管理员权限的方法
    DELPHI中build和compile有什么区别?
    线程安全的单件模式(单例模式)
    [Selenium]通过Selenium实现在当前浏览器窗口点击一个图标之后,弹出另外一个窗口,关闭这个窗口,再回到原来的窗口进行操作
    两种读写配置文件的方案(app.config与web.config通用)
  • 原文地址:https://www.cnblogs.com/MingsonZheng/p/14141650.html
Copyright © 2011-2022 走看看