日志记录提供程序
调用 CreateDefaultBuilder,这将添加默认日志记录提供程序:
- 控制台
- 调试
- EventSource
- EventLog:仅限 Windows
若要替代Host.CreateDefaultBuilder
添加的默认日志记录提供程序集,请调用 ClearProviders
并添加所需的日志记录提供程序。
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureLogging(logging => { logging.ClearProviders(); logging.AddConsole(); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
不支持在 Startup.ConfigureServices
方法中完成 DI 容器设置之前就写入日志:
- 不支持将记录器注入到
Startup
构造函数中。 - 不支持将记录器注入到
Startup.ConfigureServices
方法签名中
这一限制的原因是,日志记录依赖于 DI 和配置,而配置又依赖于 DI。 在完成 ConfigureServices
之前,不会设置 DI 容器。
日志记录应该会很快,不值得牺牲性能来使用异步代码。 如果日志记录数据存储很慢,请不要直接写入它。 考虑先将日志消息写入快速存储,然后再将其移至慢速存储。
日志类别
创建 ILogger
对象时,将指定类别。 该类别包含在由此 ILogger
实例创建的每条日志消息中。 类别字符串是任意的,但约定将使用类名称。
下表包含 ASP.NET Core 和 Entity Framework Core 使用的一些类别,并带有有关日志的注释:
类别 | 说明 |
---|---|
Microsoft.AspNetCore | 常规 ASP.NET Core 诊断。 |
Microsoft.AspNetCore.DataProtection | 考虑、找到并使用了哪些密钥。 |
Microsoft.AspNetCore.HostFiltering | 所允许的主机。 |
Microsoft.AspNetCore.Hosting | HTTP 请求完成的时间和启动时间。 加载了哪些承载启动程序集。 |
Microsoft.AspNetCore.Mvc | MVC 和 Razor 诊断。 模型绑定、筛选器执行、视图编译和操作选择。 |
Microsoft.AspNetCore.Routing | 路由匹配信息。 |
Microsoft.AspNetCore.Server | 连接启动、停止和保持活动响应。 HTTP 证书信息。 |
Microsoft.AspNetCore.StaticFiles | 提供的文件。 |
Microsoft.EntityFrameworkCore | 常规 Entity Framework Core 诊断。 数据库活动和配置、更改检测、迁移。 |
日志作用域
“作用域”可对一组逻辑操作分组 。 此分组可用于将相同的数据附加到作为集合的一部分而创建的每个日志。 例如,在处理事务期间创建的每个日志都可包括事务 ID。
[HttpGet("{id}")] public async Task<ActionResult<TodoItemDTO>> GetTodoItem(long id) { TodoItem todoItem; using (_logger.BeginScope("using block message")) { _logger.LogInformation(MyLogEvents.GetItem, "Getting item {Id}", id); todoItem = await _context.TodoItems.FindAsync(id); if (todoItem == null) { _logger.LogWarning(MyLogEvents.GetItemNotFound, "Get({Id}) NOT FOUND", id); return NotFound(); } } return ItemToDTO(todoItem); }
此时日志中会带上scope信息,前提是配置中要设置IncludeScopes为true
"Logging": { "IncludeScopes": true, "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } },
日志消息模板
占位符的顺序(而非其名称)决定了为其提供值的参数。 在以下代码中,消息模板中的参数名称不按顺序排列:
string p1 = "param1"; string p2 = "param2"; _logger.LogInformation("Parameter values: {p2}, {p1}", p1, p2); //Parameter values: param1, param2
使用占位符的名称对结果没有影响
dotnet 跟踪工具
dotnet-trace 工具是一种跨平台 CLI 全局工具,可用于收集正在运行的进程的 .NET Core 跟踪。 该工具会使用 LoggingEventSource 收集 Microsoft.Extensions.Logging.EventSource 提供程序数据。
以管理员方式运行cmd
dotnet tool install --global dotnet-trace
dotnet-trace ps 列出可从中收集跟踪的 dotnet 进程。
dotnet trace collect -p {PID} 捕获特定进程的所有日志,这些日志默认会保存在当前目录的trace.nettrace文件中,可以用PerfView工具打开该文件
如果应用不使用 CreateDefaultBuilder
生成主机,需要向应用的日志记录配置添加事件源提供程序
Perfview
使用 PerfView 实用工具收集和查看日志。 虽然其他工具也可以查看 ETW 日志,但在处理由 ASP.NET Core 发出的 ETW 事件时,使用 PerfView 能获得最佳体验。
要将 PerfView 配置为收集此提供程序记录的事件,请向 Additional Providers 列表添加字符串 *Microsoft-Extensions-Logging
。 请勿遗漏字符串起始处的 *
。