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();
});
以上两种配置方式是等价的。但是官方建议是使用第一种方式
我们创建的默认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();
}
}
启动服务发起请求:
可以看到所有日志都输出了。
我们再把日志级别修改一下,改成Warning
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning",
"LearnLogging": "Warning"
}
}
}
再次启动服务发起请求:
可以看到,现在只显示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:表示应用程序遇到了严重的错误,可能导致应用程序崩溃或无法继续运行。
以下为官方说明图:
在我们日常开发中,应该选用适合自身业务的日志级别去记录日志。如日常开发时我们可以使用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 中的日志记录功能提供了强大且灵活的工具,帮助开发人员诊断和调试应用程序,优化性能,并监控应用程序的运行情况。通过适当配置日志记录提供程序和选择合适的日志类别级别,开发人员可以根据实际需求记录和处理日志信息。在开发过程中,合理利用日志记录功能将为应用程序的开发和维护带来很大的便利。
欢迎进群催更。

asp.net core之日志的更多相关文章
- 如何利用Serilog的RequestLogging来精简ASP.NET Core的日志输出
这是该系列的第一篇文章:在ASP.NET Core 3.0中使用Serilog.AspNetCore. 第1部分-使用Serilog RequestLogging来简化ASP.NET Core的日志输 ...
- Elasticsearch,Kibana,Logstash,NLog实现ASP.NET Core 分布式日志系统
Elasticsearch - 简介 Elasticsearch 作为核心的部分,是一个具有强大索引功能的文档存储库,并且可以通过 REST API 来搜索数据.它使用 Java 编写,基于 Apac ...
- ASP.NET Core学习日志1
1.ASP.NET进行了结构化的优化,使框架更为精简,模块化更加明显. 2.ASP.NET Core不再基于System.Web.dll,而是基于细粒度.分解的NuGet包. 3.基础特性: 1.We ...
- ASP.NET Core分布式日志系统ELK实战演练
一.ELK简介 ELK是Elasticsearch.Logstash和Kibana首字母的缩写.这三者均是开源软件,这三套开源工具组合起来形成了一套强大的集中式日志管理平台. • Elastics ...
- ASP.NET Core可视化日志组件使用
前言 今天站长推荐一款日志可视化组件LogDashboard,可以不用安装第三方进程,只需要在项目中安装相应的Nuget包,添加数行代码,就可以实现拥有带Web页面的日志管理面板,十分nice哦. 下 ...
- Asp.net Core 异常日志与API返回值处理
需求: 1.对异常进行捕获记录日志 并且修改返回值给前端 解释: ILogger4是自定义的一个日志,更改它就好 解决方案1: 使用中间件进行异常捕获并且修改其返回值 public class Err ...
- Asp.net core logging 日志
1 基本概念 Dotnet core 一个重要的特征是 Dependency injection ,中文一般是依赖注入,可以简单理解为一个集合,在应用程序启动时,定义各种具体的实现类型并将其放到集合中 ...
- ASP.NET Core 添加日志NLog
1.在Nuget上搜索 NLog.Extensions.Logging 安装最新版 2.添加日志配置文件,在项目指定目录下添加配置文件nlog.config,内容添加如下: <?xml vers ...
- 总结:利用asp.net core日志进行生产环境下的错误排查(asp.net core version 2.2,用IIS做服务器)
概述 调试asp.net core程序时,在输出窗口中,在输出来源选择“调试”或“xxx-ASP.NET Core Web服务器”时,可以看到类似“info:Microsoft.AspNetCore. ...
- 第17章 使用日志记录监视和排除错误(ASP.NET Core in Action, 2nd Edition)
第3部分 扩展应用程序 我们在第1部分和第2部分中介绍了大量内容:我们查看了您将用于构建传统服务器渲染的 Razor Pages 应用程序以及 Web API 的所有主要功能组件.在第3部分中,我们将 ...
随机推荐
- 逍遥自在学C语言 | 条件控制的正确使用姿势
前言 在C语言中,有三种条件判断结构:if语句.if-else语句和switch语句. 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白 ...
- 我做了一个 VSCode 插件版的 ChatGPT
大家好,我是风筝 其实很早之前就想学学 VSCode 插件开发了,但是又不知道做什么,加上我这半吊子前端水平,迟迟没有动手. 最近 ChatGPT 火的一塌糊涂,我也一直在用,真的非常好用,有些问题之 ...
- 2021-12-22:回文子串。 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。
2021-12-22:回文子串. 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目. 回文字符串 是正着读和倒过来读一样的字符串. 子字符串 是字符串中的由连续字符组成的一个序列. ...
- 2021-07-29:最大路径和。给定一个矩阵matrix,先从左上角开始,每一步只能往右或者往下走,走到右下角。然后从右下角出发,每一步只能往上或者往左走,再回到左上角。任何一个位置的数字,只能获得
2021-07-29:最大路径和.给定一个矩阵matrix,先从左上角开始,每一步只能往右或者往下走,走到右下角.然后从右下角出发,每一步只能往上或者往左走,再回到左上角.任何一个位置的数字,只能获得 ...
- vue全家桶进阶之路34:Vue3 路由基本配置
在Vue3中,路由的基本配置是通过使用Vue Router库来实现的.以下是Vue3中路由的基本配置步骤: 安装Vue Router 使用npm或yarn在项目中安装Vue Router: npm i ...
- 卸载与重装Vue3及项目文件重创错误
卸载与重装Vue3及项目文件的重创错误 首先先来个vue的卸载命令,直接win+R打开cmd npm uninstall -g @vue/cli 或 yarn global remove ...
- 《最新出炉》系列初窥篇-Python+Playwright自动化测试-2-playwright的API及其他知识
1.简介 上一篇宏哥已经将Python+Playwright的环境搭建好了,而且也简单的演示了一下三款浏览器的启动和关闭,是不是很简单啊.今天主要是把一篇的中的代码进行一次详细的注释,然后说一下pla ...
- Nginx 反向代理的配置和注意点(成功配置)
反向代理配置成功 首先,Nginx 和 Java 后端都运行在云服务器的 docker 容器中.ps: 需要确保云服务器端口正常开放,以及两个容器都能被正常的访问. 现在想让 ng 做反向代理达到如下 ...
- 解决github无法打开问题
在国内访问国外服务器(如github)会有卡顿.无法加载等问题,提供两种解决方案: 1.查看github的IP地址并修改Hosts windows键+R,打开cmd(或windows键+X,打开Win ...
- Python编程和数据科学中的数据处理:如何从数据中提取有用的信息和数据
目录 引言 数据分析和数据处理是数据科学和人工智能领域的核心话题之一.数据科学家和工程师需要从大量的数据中提取有用的信息和知识,以便更好地理解和预测现实世界中的事件.本文将介绍Python编程和数据科 ...