• asp.net core之日志


    日志记录在应用程序开发中起着至关重要的作用,它可以帮助开发人员诊断和调试问题,同时也是监控和性能优化的重要工具。ASP.NET Core 提供了强大且灵活的日志记录功能,本文将详细介绍ASP.NET Core 中的日志记录,包括日志配置、日志类别级别、使用场景以及日志记录提供程序。

    日志配置#

    在ASP.NET Core中,日志记录是通过日志记录提供程序(Logging Provider)来实现的。首先,我们需要在应用程序中进行日志配置。
    下面的代码将重写由 WebApplication.CreateBuilder 添加的一组默认的日志记录提供程序:

    var builder = WebApplication.CreateBuilder(args);
    builder.Logging.ClearProviders();
    builder.Logging.AddConsole();
    

    或者使用这种方式配置:

    var builder = WebApplication.CreateBuilder();
    builder.Host.ConfigureLogging(logging =>
    {
        logging.ClearProviders();
        logging.AddConsole();
    });
    

    以上两种配置方式是等价的。但是官方建议是使用第一种方式
    image.png
    我们创建的默认asp.net core模板中appsettings.json已经包含了默认的日志配置参数:

    {
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning"
        }
      }
    }
    
    

    在上述 JSON 中:

    • 指定了 "Default" 和 "Microsoft.AspNetCore" 类别。
    • "Microsoft.AspNetCore" 类别适用于以 "Microsoft.AspNetCore" 开头的所有类别。 例如,此设置适用于 "Microsoft.AspNetCore.Routing.EndpointMiddleware" 类别。
    • "Microsoft.AspNetCore" 类别在日志级别 Warning 或更高级别记录。
    • 未指定特定的日志提供程序,因此 LogLevel 适用于所有启用的日志记录提供程序,但 Windows EventLog 除外。

    这里的类别其实就是指我们的命名空间,Microsoft.AspNetCore就是指Microsoft.AspNetCore开头的所有命名空间。Default表示默认,即没有指定特定命名空间日志级别时所用的级别。
    接下来我们添加我们自己的日志级别:

    {
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning",
          "LearnLogging": "Trace"
        }
      }
    }
    

    在控制器中记录日志:

        public class WeatherForecastController : ControllerBase
        {
            private static readonly string[] Summaries = new[]
            {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };
    
            private readonly ILogger _logger;
    
            public WeatherForecastController(ILogger logger)
            {
                _logger = logger;
            }
    
            [HttpGet(Name = "GetWeatherForecast")]
            public IEnumerable Get()
            {
                _logger.LogTrace("LogTrace");
                _logger.LogDebug("LogDebug");
                _logger.LogInformation("LogInformation");
                _logger.LogWarning("LogWarning");
                _logger.LogError("LogError");
                _logger.LogCritical("LogCritical");
                return Enumerable.Range(1, 5).Select(index => new WeatherForecast
                {
                    Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
                    TemperatureC = Random.Shared.Next(-20, 55),
                    Summary = Summaries[Random.Shared.Next(Summaries.Length)]
                })
                .ToArray();
            }
        }
    

    启动服务发起请求:
    image.png
    可以看到所有日志都输出了。
    我们再把日志级别修改一下,改成Warning

    {
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning",
          "LearnLogging": "Warning"
        }
      }
    }
    
    

    再次启动服务发起请求:
    image.png
    可以看到,现在只显示Warning级别以上的日志。
    除上述全局的配置以外,我们还可以单独配置日志提供程序。以下是一个官方配置示例:

    {
      "Logging": {
        "LogLevel": { // No provider, LogLevel applies to all the enabled providers.
          "Default": "Error",
          "Microsoft": "Warning",
          "Microsoft.Hosting.Lifetime": "Warning"
        },
        "Debug": { // Debug provider.
          "LogLevel": {
            "Default": "Information" // Overrides preceding LogLevel:Default setting.
          }
        },
        "Console": {
          "IncludeScopes": true,
          "LogLevel": {
            "Microsoft.AspNetCore.Mvc.Razor.Internal": "Warning",
            "Microsoft.AspNetCore.Mvc.Razor.Razor": "Debug",
            "Microsoft.AspNetCore.Mvc.Razor": "Error",
            "Default": "Information"
          }
        },
        "EventSource": {
          "LogLevel": {
            "Microsoft": "Information"
          }
        },
        "EventLog": {
          "LogLevel": {
            "Microsoft": "Information"
          }
        },
        "AzureAppServicesFile": {
          "IncludeScopes": true,
          "LogLevel": {
            "Default": "Warning"
          }
        },
        "AzureAppServicesBlob": {
          "IncludeScopes": true,
          "LogLevel": {
            "Microsoft": "Information"
          }
        },
        "ApplicationInsights": {
          "LogLevel": {
            "Default": "Information"
          }
        }
      }
    }
    

    在上述示例中:

    • 类别和级别不是建议的值。 提供该示例是为了显示所有默认提供程序。
    • Logging.{PROVIDER NAME}.LogLevel 中的设置会覆盖 Logging.LogLevel 中的设置,其中 {PROVIDER NAME} 占位符是提供程序名称。 例如,Debug.LogLevel.Default 中的级别将替代 LogLevel.Default 中的级别。
    • 将使用每个默认提供程序别名。 每个提供程序都定义了一个别名;可在配置中使用该别名来代替完全限定的类型名称。 内置提供程序别名包括:
      • Console
      • Debug
      • EventSource
      • EventLog
      • AzureAppServicesFile
      • AzureAppServicesBlob
      • ApplicationInsights

    日志类别级别#

    在上面我们测试时使用的实例包含了不同级别的日志。

    _logger.LogTrace("LogTrace");
    _logger.LogDebug("LogDebug");
    _logger.LogInformation("LogInformation");
    _logger.LogWarning("LogWarning");
    _logger.LogError("LogError");
    _logger.LogCritical("LogCritical");
    

    ASP.NET Core 提供了多个日志类别级别,用于控制日志记录的详细程度。以下是常用的日志类别级别:

    • Trace:最详细的日志级别,适用于跟踪应用程序的内部工作细节。
    • Debug:用于调试目的的日志级别,适用于开发和测试阶段。
    • Information:提供应用程序运行过程中的重要信息。
    • Warning:表示应用程序遇到了一些非严重的问题。
    • Error:表示应用程序遇到了可恢复的错误。
    • Critical:表示应用程序遇到了严重的错误,可能导致应用程序崩溃或无法继续运行。

    以下为官方说明图:
    image.png
    在我们日常开发中,应该选用适合自身业务的日志级别去记录日志。如日常开发时我们可以使用Debug,发布到线上环境时把日志级别调高,就不会输出debug日志信息。 同时减少日志输出也可以提高部分性能。

    日志记录提供程序#

    在上述日志配置中,我们提到了日志提供程序。ASP.NET Core 提供了多种日志记录提供程序,可以将日志信息输出到不同的目标,例如控制台、文件、数据库等。以下是常用的日志记录提供程序:

    • ConsoleLoggerProvider:将日志信息输出到控制台。
    • DebugLoggerProvider:将日志信息输出到调试器。
    • EventLogLoggerProvider:将日志信息输出到Windows事件日志。
    • FileLoggerProvider:将日志信息输出到文件。

    添加方法如下:

    builder.Logging.AddConsole();
    builder.Logging.AddDebug();
    builder.Logging.AddEventLog();
    

    ASP.NET Core 包括以下日志记录提供程序作为共享框架的一部分:

    • Console
    • Debug
    • EventSource
    • EventLog

    若需要其他的日志记录提供程序,则可以使用第三方组件。目前我们常用的第三方日志组件有:

    需要的可以自行学习和使用这些三方日志组件,这些组件提供能写入ELK日志,文件,数据库等等的日志记录提供程序,亦可自行扩展。

    日志使用方式#

    在大部分使用场景中,我们都可以直接通过依赖注入注入ILogger去使用,如:

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

    在一些特殊场景中,我们也可以通过注入ILoggerFactory去创建我们指定类别名称的一个ILogger实例。

    public WeatherForecastController(ILoggerFactory loggerFactory)
    {
        _logger = loggerFactory.CreateLogger();
        // _logger = loggerFactory.CreateLogger("LearnLogging.Controllers.WeatherForecastController");
    }
    

    上面的创建ILogger实例都是等价的。根据对应的需求使用不同的方法即可。

    日志使用场景#

    日志记录在应用程序开发中有多种使用场景,包括但不限于:

    • 调试和故障排除:通过记录详细的日志信息,开发人员可以了解应用程序在运行过程中的内部状态,从而更容易定位和修复问题。
    • 性能优化:通过记录关键的性能指标,开发人员可以识别和优化应用程序中的性能瓶颈。
    • 监控和警报:通过记录关键的应用程序事件和错误,可以实时监控应用程序的运行情况,并及时采取措施。
    • 安全审计:记录用户操作和安全事件,以便进行审计和追踪。

    ASP.NET Core 中的日志记录功能提供了强大且灵活的工具,帮助开发人员诊断和调试应用程序,优化性能,并监控应用程序的运行情况。通过适当配置日志记录提供程序和选择合适的日志类别级别,开发人员可以根据实际需求记录和处理日志信息。在开发过程中,合理利用日志记录功能将为应用程序的开发和维护带来很大的便利。

    欢迎进群催更。

  • 相关阅读:
    不要小看了积分商城,它的作用可以很大
    Python | Leetcode Python题解之第150题逆波兰表达式求值
    SA实战 ·《SpringCloud Alibaba实战》第03章-微服务介绍
    力扣(LeetCode)算法_C++——稀疏矩阵的乘法
    [CG从零开始] 5. 搞清 MVP 矩阵理论 + 实践
    基于gRPC编写golang简单C2远控
    C#源码 LIS实验室(检验科)信息系统源码 SaaS模式的Client/Server架构
    语法练习:missing_char
    格林公式挖洞法中内曲线顺时针的直观解释
    AI视频模型已成为科技领域的新热点
  • 原文地址:https://www.cnblogs.com/fanshaoO/p/17595928.html