当使用ASP.NET Core 6构建的应用程序时,你可能经常想使用跟踪和记录来监控你的应用程序的性能和诊断错误。你也可以在生产环境中使用跟踪来衡量你的应用程序在运行时的表现。这篇文章讨论了我们如何在ASP.NET Core 6中使用追踪。我们将研究如何使用跟踪监听器来收集跟踪信息,并使用ILogger将跟踪输出引导到事件日志中。
当使用ASP.NET Core 6构建的应用程序时,你可能经常想使用跟踪和记录来监控你的应用程序的性能和诊断错误。你也可以在生产环境中使用跟踪来衡量你的应用程序在运行时的表现。
这篇文章讨论了我们如何在ASP.NET Core 6中使用追踪。我们将研究如何使用跟踪监听器来收集跟踪信息,并使用ILogger将跟踪输出引导到事件日志中。
要使用本文提供的代码示例,你的系统中应该安装有Visual Studio 2022。如果你还没有副本,你可以在这里下载Visual Studio 2022。
在Visual Studio 2022中创建一个ASP.NET Core Web API项目
首先,让我们在Visual Studio 2022中创建一个ASP.NET Core项目。按照这些步骤将在Visual Studio 2022中创建一个新的ASP.NET Core 6 Web API项目。
- 启动Visual Studio 2022 IDE。
- 点击 "创建新项目"。
- 在 "创建新项目 "窗口,从显示的模板列表中选择 "ASP.NET Core Web API"。
- 点击 "下一步"。
- 在 "配置你的新项目 "窗口中,指定新项目的名称和位置。
- 根据你的喜好,可以选择勾选 "将解决方案和项目放在同一目录下 "复选框。
- 点击 "下一步"。
- 在接下来显示的 "附加信息 "窗口中,确保勾选 "使用控制器... "的复选框,因为我们在这个例子中不会使用最小的API。将 "验证类型 "保留为 "无"(默认)。
- 确保 "启用Docker"、"为HTTPS配置 "和 "启用开放API支持 "的复选框不被选中,因为我们不会在这里使用任何这些功能。
- 点击创建。
我们将使用这个ASP.NET Core 6 Web API项目,在本文的后续部分使用跟踪监听器。
什么是跟踪?
与追踪主要事件的事件日志相比,追踪可以更全面地了解运行中的应用程序及其组件。日志由结构化或非结构化的时间戳数据组成,显示了你的应用程序中发生的事件的记录。追踪提供了对单个请求以及它如何被处理的更多可见性。
System.Diagnostics命名空间包含Trace和Debug类。跟踪类在生产环境中使用,而调试类在开发时使用。
追踪通常包括以下三个阶段。
- 工具化。我们编写必要的代码来捕获相关信息
- 追踪。我们把跟踪信息写到指定的目标,即事件日志、文本文件、数据库表等。
- 分析。我们分析从跟踪中收集到的信息,以确定应用程序中的瓶颈。
什么是跟踪监听器?为什么需要它们?
跟踪监听器收集跟踪信息,存储它们,并将它们引导到一个适当的目标,如文本文件。.NET提供了几种跟踪监听器,包括以下几种。
- ConsoleTraceListener - 将跟踪信息发送到控制台窗口。
- DefaultTraceListener - 将跟踪信息发送到标准调试输出。
- DelimitedListTraceListener - 将跟踪输出以限定的格式发送到流、流作家或文本作家。
- EventLogTraceListener - 发送跟踪信息到事件日志。
- TextWriterTraceListener - 发送跟踪信息到一个文本文件。
- XmlWriterTraceListener - 将跟踪信息转换为XML。
System.Diagnostics.Debug和System.Diagnostics.Trace类可以向跟踪监听器发送消息,而监听器又将消息发送到适当的目标。
在ASP.NET Core 6中使用配置文件创建一个跟踪监听器
你可以通过使用配置文件或编写自定义代码来创建一个跟踪监听器。下面显示的代码片断说明了如何使用你的应用程序配置文件创建一个跟踪监听器。
<configuration>
所有添加到监听器集合中的监听器都会收到跟踪输出。然而,你可以使用一个监听器而不把它添加到监听器集合中。在这种情况下,你在监听器中使用Write或WriteLine方法发送输出。
下面的代码说明了一个监听器,它没有被添加到监听器集合中,但仍然能够将跟踪信息发送到输出窗口、文件或任何预先配置的输出。
TextWriterTraceListener myFirstListener = new
在ASP.NET Core 6中创建一个自定义跟踪监听器
在大多数情况下,.NET 6默认附带的跟踪监听器将满足您的要求。然而,如果你想把你的跟踪信息输出到不同的目的地,你可以实现你自己的跟踪监听器。
要建立一个自定义的跟踪监听器,你应该创建一个扩展TraceListener抽象类的类。在TraceListener类中有几个虚拟和抽象的方法。你至少应该实现Write和WriteLine方法。至少,你的自定义跟踪监听器应该看起来像这样。
public class CustomTraceListener : TraceListener
所以,你的自定义跟踪监听器类必须有一个参数构造器和Write和WriteLine方法。
你还需要一个ILogger实例来代表记录器,一个记录器工厂来创建记录器,以及一个StringBuilder来存储跟踪消息,然后再将它们发送到日志目标。
private readonly ILoggerFactory _loggerFactory;
你可以利用依赖注入的优势,在构造函数中注入ILoggerFactory的一个实例,然后使用该实例来创建ILogger的一个实例。
public CustomTraceListener(ILoggerFactory loggerFactory)
这里是Write和WriteLine方法的一个最小实现。
public override void Write(string? message, string? category)
ASP.NET Core 6中完整的自定义跟踪监听器示例
下面是我们对自定义跟踪监听器的最小实现的完整源代码,供您参考。
using System.Collections.Concurrent;
在Program.cs文件中注册自定义跟踪监听器
要使用自定义跟踪监听器,你应该使用以下代码在监听器集合中注册它。
var loggerFactory = app.Services.GetRequiredService<ILoggerFactory>();
因为我们的自定义跟踪监听器已经被添加到监听器集合中,它将捕获所有由运行时产生的跟踪消息,并将输出发送到我们的记录器。它还将发送我们在应用程序中明确发送的任何跟踪消息(就像我们在前面的myFirstListener例子中做的那样)。
因此,任何添加到监听器集合的监听器都可以捕获由运行时产生的跟踪信息,以及在应用程序中明确发送的任何跟踪信息。然而,如果一个跟踪监听器没有被添加到集合中,它只能发送应用程序中明确发送的跟踪消息。它不会捕获任何由运行时产生的跟踪消息。