首页 > 编程语言 >asp.net core之日志

asp.net core之日志

时间:2023-08-01 11:14:26浏览次数:71  
标签:core asp 记录 LogLevel Microsoft Default net 日志 logger

日志记录在应用程序开发中起着至关重要的作用,它可以帮助开发人员诊断和调试问题,同时也是监控和性能优化的重要工具。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<WeatherForecastController> _logger;

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

        [HttpGet(Name = "GetWeatherForecast")]
        public IEnumerable<WeatherForecast> 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<WeatherForecastController> logger)
{
    _logger = logger;
}

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

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

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

日志使用场景

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

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

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

欢迎进群催更。

标签:core,asp,记录,LogLevel,Microsoft,Default,net,日志,logger
From: https://www.cnblogs.com/fanshaoO/p/17595928.html

相关文章

  • 7种方法!教你如何使用Telerik UI for ASP.NET定制编辑器
    TelerikUIforASP.NETCore是用于跨平台响应式Web和云开发的最完整的UI工具集,拥有超过60个由KendoUI支持的ASP.NET核心组件。它的响应式和自适应的HTML5网格,提供从过滤、排序数据到分页和分层数据分组等100多项高级功能。TelerikUIforASP.NETCore的编辑器是一个多功能的所......
  • 6.6 卷积神经网络LeNet
    LeNet,它是最早发布的卷积神经网络之一,因其在计算机视觉任务中的高效性能而受到广泛关注。这个模型是由AT&T贝尔实验室的研究员YannLeCun在1989年提出的(并以其命名),目的是识别图像中的手写数字。总体来看,LeNet由两个部分组成:卷积编码器:由两个卷积层组成;全连接层密集块:由三......
  • NET6 Webapi 大驼峰传到前端变成了小驼峰
    JsonSerializerOptions.PropertyNamingPolicy属性services.AddControllers().AddJsonOptions(options=>{//获取或设置一个值,该值指定用于将对象的属性名称转换为其他格式(例如camel大小写)的策略;若为null,则保持属性名称不变......
  • 网工应用层:电子邮件Email、SMTP协议与使用Telnet发送电子邮件
    参考资料:https://www.bilibili.com/video/BV1c4411d7jb?p=72&vd_source=e66dd25b0246f28e772d75f11c80f03c湖科大的高军老师做的计算机网络课,去年选修的计网全靠高老师,生动,举例丰富,配套实验课,无废话纯干货,单推一波!电子邮件介绍电子邮件(E-mail)是一种用电子手段提供信息交换的......
  • [回馈]ASP.NET Core MVC开发实战之商城系统(四)
    经过一段时间的准备,新的一期【ASP.NETCoreMVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面等功能的开发,今天继续讲解商品详情功能开发,仅供学习分享使......
  • asp.net上传文件到服务器指定文件夹问题
    ​ IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头。 一. 两个必要响应头Accept-Ranges、ETag        客户端每次提交下载请求时,服务端都要添加这两个响应头,以保证客户端和服务端将此下载识别为可以断点续......
  • SHFB:为 .NET 类库快速生成说明文档
    SHFB全称SandcastleHelpFileBuilder,项目地址:https://github.com/EWSoftware/SHFB。它使用代码中的xml注释生成说明文档。因此,使用SHFB之前要给代码编写好xml注释。安装进入项目的GithubRelease页面:https://github.com/EWSoftware/SHFB/releases下载最新发行版本,SHFB......
  • NET/C#中SM2/SM3国密加密算法
    usingOrg.BouncyCastle.Asn1;usingOrg.BouncyCastle.Asn1.GM;usingOrg.BouncyCastle.Asn1.X9;usingOrg.BouncyCastle.Crypto;usingOrg.BouncyCastle.Crypto.Parameters;usingOrg.BouncyCastle.Math;usingOrg.BouncyCastle.Security;usingOrg.BouncyCastle.Util......
  • 7.kubernetes存储卷、持久卷、pv和pvc、NFS CSI部署示例
    pod资源规范总结资源类型获取:kubectlaip-resources资源群组获取:kubectlaip-versions特定资源的规范获取:kubectlexplain<Kind>.pod运行自主式pod,非受控于工作负载型控制器直接由kubelet管理apiVersion:v1kind:Po......
  • 简简单单学docker在群晖nas中构建docker版aspnetcore网站
    琢磨了n天,掉了好多头发,终于可以了,踩坑无数!终于行了!先来了解下:1.net运行时runtime和sdk,简单来说就是sdk开发用的,runtime是用来运行的,所以构建dockerfile只用runtime就够了!2.docker运行不需要打包操作系统如ubuntu等进入包内!特殊需要的可以!这个问题都必须了解!正式开始1.用vs202......