.NET 記錄和追蹤
檢測程式碼可產生記錄,以記錄下程式執行時所發生的有趣事件。 若要了解應用程式的行為,您可檢閱記錄。 .NET 在其過往中累積了數個不同的記錄 API,本文會協助您了解可用的選項。
注意
有時記錄也稱為「追蹤」,包含在某些較舊的 Windows 和 .NET API。 近年來,「追蹤」更常用做為分散式追蹤的縮寫,但在本文中不是這個意思。
.NET 記錄 API
ILogger
在大部分情況下,無論是將記錄新增至現有專案還是建立新專案,ILogger 基礎結構都是理想的預設選擇。 ILogger
支援快速 結構化記錄、靈活的配置以及包括控制台在內的一系列常見接收器,這是您在執行 ASP.NET 應用程式時看到的內容。 此外,ILogger
介面也可以作為許多第三方記錄實作的外觀,以提供豐富的功能和擴充性。
ILogger 提供適用於 .NET 的 OpenTelemetry 實作記錄案例,可讓您將應用程式中的記錄輸出到各種 APM 系統,以進行進一步分析。
EventSource
EventSource 是一個較舊的高性能 API,具有 結構化記錄。 其原本是設計來與 Windows 事件追蹤 (ETW) 整合的,但後來擴充為可支援 EventPipe 跨平台追蹤和 EventListener 以便自訂接收。 相較於 ILogger
,EventSource
具有相對較少的預先製作記錄接收器,並且沒有內建支援通過單獨的組態檔進行設定。 如果您想要更嚴格地控制 ETW 或 EventPipe 整合,EventSource
非常適合,但如果只要進行一般用途的記錄,ILogger
會更有彈性且更容易使用。
追蹤
System.Diagnostics.Trace 和 System.Diagnostics.Debug 是 .NET 最早期的記錄 API。 這些類別具有彈性設定 API 和大型接收器生態系統 ,但僅支援非結構化記錄。 在 .NET Framework 上,您可以透過 app.config 檔案設定這些類別,但在 .NET Core 中,則沒有內建的檔案型設定機制。 在偵錯工具之下執行時,其通常用於為開發人員產生診斷輸出。 為了提供回溯相容性,.NET 小組會繼續支援這些 API,但不會增加任何新功能。 對於已經使用這些 API 的應用程式來說,這些 API 是不錯的選擇。 但對於尚未決定使用哪個記錄 API 的較新應用程式來說,ILogger
可以提供更好的功能。
特製化記錄 API
主控台
System.Console 類別有 Write 和 WriteLine 方法可用於簡單的記錄案例。 這些 API 很容易就能開始使用,但其解決方案的彈性不會像一般用途記錄 API 那麼好。 主控台僅允許非結構化記錄,並且不支援選取啟用哪些記錄消息或目標重新設定為不同的接收器。 搭配主控台接收使用 ILogger 或追蹤 API 不需要另外花費太多心力,並且可以讓記錄保持可供設定的狀態。
DiagnosticSource
System.Diagnostics.DiagnosticSource 適用於會在處理序內同步分析記錄訊息,而不是將記錄訊息序列化至任何儲存體的記錄功能。 這可讓來源和接聽程式以訊息形式交換任意 .NET 物件,然而大部分的記錄 API 都需要可序列化的記錄事件。 如果能有效率地實作接聽程式,這項技術也會非常快速,能在數十奈秒內處理記錄事件。 使用這些 API 的工具往往更像是內含式分析工具,不過 API 在這裡不會施加任何條件約束。
EventLog
System.Diagnostics.EventLog 是僅限 Windows 的 API,會將訊息寫入到 Windows EventLog。 在許多情況下,在 Windows 上執行時,將 ILogger 與可選的 EventLog 接收器一起使用可能會提供類似的功能,而無需將應用程式與 Windows 操作系統緊密結合。
記錄術語
結構化與非結構化記錄
記錄也可分為結構化或非結構化形式:
- 非結構化:記錄專案會編碼為人類可以讀取的自由格式文字,但很難以程式設計方式剖析和查詢。
- 結構化:記錄項目具有妥善定義的結構描述,而且能以不同的二進位檔和文字格式進行編碼。 這些記錄會設計為可供機器轉譯和查詢,因此人類和自動化系統都能輕鬆地使用。
良好的結構化記錄 API 可以提供更多功能與效能,只有稍微增加使用量的複雜度。
接收
大部分的記錄 API 都允許將記錄訊息傳送至稱為接收的不同目的地。 某些 API 有大量預先建立的接收,某些 API 則只有一些接收。 如果沒有預先建立的接收,通常會有擴充性 API 可讓您撰寫自訂接收,不過這需要撰寫更多程式碼。