譯者:李睿
開發人員可以利用ASP.NET Core 6中的跟蹤偵聽器為其應用程序添加性能和調試工具。
在處理使用ASP.NET Core 6構建的應用程序時,開發人員可能經常希望使用跟蹤和日誌記錄來監控應用程序的性能並診斷錯誤,還可以在生產環境中使用跟蹤來衡量應用程序在運行時的執行情況。
要使用本文中提供的代碼示例,應該在系統中安裝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項目:
(1)啟動Visual Studio 2022 IDE。
(3)在“創建新項目”窗口中,從顯示的模板列表中選擇“ASP.NET Core Web API”。
(4)單擊“下一步”。
(5)在“配置新項目”窗口中,指定新項目的名稱和位置。
(6)根據偏好,可以選擇選中“將解決方案和項目放在同一目錄中”複選框。
(7)單擊“下一步”。
(8)在接下來顯示的“附加信息”窗口中,確保選中“使用控制器...”複選框,因為在這示例中不會使用最少的API。將“身份驗證類型”保留為“無”(默認)。
(9)確保未選中“啟用Docker”、“為HTTPS配置”和“啟用開放API支持”複選框,因為不會在此處使用任何這些功能。
(10)單擊創建。
在本文中,將使用這個ASP.NET Core 6 Web API項目來處理跟蹤偵聽器。
什麼是跟蹤?
與跟蹤主要事件的事件日誌相比,跟蹤允許更完整地查看正在運行的應用程序及其組件。日誌包含結構化或非結構化時間戳數據,這些數據顯示應用程序中發生的事件的記錄。跟蹤提供了對單個請求及其處理方式的更多可見性。
System.Diagnostics命名空間包含跟蹤類和調試類。跟蹤類用於生產環境,而調試類用於開發時。
跟蹤通常涉及以下三個階段:
檢測:編寫必要的代碼來捕獲相關信息。
跟蹤:將跟蹤消息寫入指定的目標,即事件日誌、文本文件、數據庫表等。
分析:分析從跟蹤中收集的信息以確定應用程序中的瓶頸。
什麼是跟蹤偵聽器?為什麼需要它們?
跟蹤偵聽器收集跟蹤消息、存儲它們,並將它們定向到適當的目標,例如文本文件。.NET提供了幾個跟蹤偵聽器,其中包括:
ConsoleTraceListener——將跟蹤消息發送到控制檯窗口。
DefaultTraceListener——將跟蹤消息發送到標準調試輸出。
DelimitedListTraceListener——以分隔格式將跟蹤輸出發送到流、流編寫器或文本編寫器。
EventLogTraceListener——將跟蹤消息發送到事件日誌。
TextWriterTraceListener——將跟蹤消息發送到文本文件。
XmlWriterTraceListener——將跟蹤消息轉換為XML。
System.Diagnostics.Debug和System.Diagnostics.Trace類可以將消息發送到跟蹤偵聽器,這些偵聽器又將消息路由到適當的目標。
在ASP.NET Core 6中使用配置文件創建跟蹤偵聽器
開發人員可以使用配置文件或編寫自定義代碼來創建跟蹤偵聽器。下面顯示的代碼片段說明了如何使用應用程序配置文件創建跟蹤偵聽器。
複製<configuration> <system.diagnostics> <trace autoflush="false" indentsize="4"> <listeners> <add name="MyFirstListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="TraceOutput.txt" /> <remove name="Default" /> </listeners> </trace> </system.diagnostics> </configuration>1.2.3.4.5.6.7.8.9.10.11.12.
添加到Listeners集合的所有偵聽器都將接收跟蹤輸出。但是,可以使用偵聽器而不將其添加到偵聽器集合中。在這種情況下,使用偵聽器中的Write或WriteLine方法發送輸出。
以下的代碼演示了一個偵聽器,該偵聽器未添加到偵聽器集合,但仍能夠將跟蹤消息發送到輸出窗口、文件或任何預配置的輸出。
複製TextWriterTraceListener myFirstListener = newTextWriterTraceListener("Output.txt", "myFirstListener");myFirstListener.WriteLine("This is a test message.");myFirstListener.Flush();1.2.3.4.
在ASP.NET Core 6中創建自定義跟蹤偵聽器
在大多數情況下,.NET 6附帶的跟蹤偵聽器將滿足要求。但是,如果開發人員想將跟蹤消息輸出到不同的目的地,可以實現自己的跟蹤偵聽器。
要構建自定義跟蹤偵聽器,應該創建一個擴展TraceListener抽象類的類。TraceListener類中有幾個虛擬和抽象方法。開發人員至少應該實現Write和WriteLine方法。自定義跟蹤偵聽器如下所示:
複製public class CustomTraceListener : TraceListener{ public CustomTraceListener(ILoggerFactory loggerFactory) { } public override void Write(string? message, string? category) { } public override void Write(string? message) { } public override void WriteLine(string? message) { } }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.
因此,自定義跟蹤偵聽器類必須具有參數構造函數以及Write和WriteLine方法。
開發人員還需要一個表示記錄器的ILogger實例、一個創建記錄器的ILoggerFactory和一個StringBuilder來存儲跟蹤消息,然後再將它們發送到日誌目標。
複製private readonly ILoggerFactory _loggerFactory;private readonly ILogger _iLogger;private readonly StringBuilder _stringBuilder = new();1.2.3.
開發人員可以利用依賴注入在構造函數中注入ILoggerFactory的實例,然後使用該實例創建ILogger的實例。
複製public CustomTraceListener(ILoggerFactory loggerFactory){ _loggerFactory = loggerFactory; _iLogger = loggerFactory.CreateLogger(nameof(CustomTraceListener));}1.2.3.4.5.
下面是Write和WriteLine方法的最小實現:
複製public override void Write(string? message, string? category){ _stringBuilder.Append(message + "-" + category);}public override void Write(string? message){ _stringBuilder.Append(message);}public override void WriteLine(string? message){ _stringBuilder.AppendLine(message); _iLogger.LogInformation(_stringBuilder.ToString()); _stringBuilder.Clear();}1.2.3.4.5.6.7.8.9.10.11.12.13.14.
ASP.NET Core 6中完整的自定義跟蹤偵聽器示例
以下是自定義跟蹤偵聽器的最小實現的完整源代碼,以供參考。
複製using System.Collections.Concurrent;using System.Diagnostics;using System.Text;namespace TraceListenerDemo{ public class CustomTraceListener : TraceListener { private readonly ILoggerFactory _loggerFactory; private readonly ILogger _iLogger; private readonly StringBuilder _stringBuilder = new(); public CustomTraceListener(ILoggerFactory loggerFactory) { _loggerFactory = loggerFactory; _iLogger = loggerFactory.CreateLogger(nameof(CustomTraceListener)); } public override void Write(string? message, string? category) { _stringBuilder.Append(message + "-" + category); } public override void Write(string? message) { _stringBuilder.Append(message); } public override void WriteLine(string? message) { _stringBuilder.AppendLine(message); _iLogger.LogInformation(_stringBuilder.ToString()); _stringBuilder.Clear(); } } }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.
在Program.cs文件中註冊自定義跟蹤偵聽器
要使用自定義跟蹤偵聽器,應該使用以下代碼將其註冊到Listeners集合。
複製var loggerFactory = app.Services.GetRequiredService<ILoggerFactory>();Trace.Listeners.Add(new LoggerTraceListener(loggerFactory));1.2.
因為自定義跟蹤偵聽器已經添加到偵聽器集合中,所以它將捕獲運行時生成的所有跟蹤消息,並將輸出發送到記錄器。它還將發送在應用程序中顯式發送的任何跟蹤消息(就像在前面的myFirstListener示例中所做的那樣)。
因此,添加到Listeners集合的任何偵聽器都可以捕獲運行時生成的跟蹤以及在應用程序中顯式發送的任何跟蹤消息。但是,如果未將跟蹤偵聽器添加到集合中,則它只能發送在應用程序中顯式發送的跟蹤消息。它不會捕獲運行時生成的任何跟蹤消息。
使用自定義跟蹤偵聽器時,必須記住關閉或刷新跟蹤偵聽器以確保清空輸出緩衝區。可以利用StringBuilderCache類來優化使用StringBuilder的代碼(在CustomTraceListener類中)。