ASP.NET 2.0 引入 TraceContext.TraceFinished 事件,讓開發者能在所有追蹤資料收集完成後,以程式碼存取、過濾、自訂輸出追蹤資訊,極大擴展診斷彈性。
TraceContext:頁面層級追蹤上下文 (Page.Trace / Context.Trace)。TraceContextEventArgs:事件參數,屬性 TraceRecords 為 TraceContextRecord 集合。TraceContextRecord:單筆追蹤記錄,含 Category、Message、IsWarning、ErrorInfo、TraceTimestamp 等屬性。<%@ Page Language="C#" %>
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
Trace.TraceFinished += OnTraceFinished;
Trace.Write("自定義類別", "自定義追蹤訊息");
Trace.Warn("警告類別", "這是一個警告");
}
private void OnTraceFinished(object sender, TraceContextEventArgs e)
{
Response.Write("<ul>");
foreach (TraceContextRecord record in e.TraceRecords)
{
string css = record.IsWarning ? "style='color:red'" : "";
Response.Write($"<li {css}>類別:{record.Category} 訊息:{record.Message} 時間:{record.TraceTimestamp}</li>");
}
Response.Write("</ul>");
}
</script>
<%@ Page Language="VB" %>
<script runat="server">
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
AddHandler Trace.TraceFinished, AddressOf OnTraceFinished
Trace.Write("自定義類別", "自定義追蹤訊息")
End Sub
Private Sub OnTraceFinished(ByVal sender As Object, ByVal e As TraceContextEventArgs)
Response.Write("<ul>")
For Each record As TraceContextRecord In e.TraceRecords
Dim css As String = If(record.IsWarning, "style='color:red'", "")
Response.Write($"<li {css}>類別:{record.Category} 訊息:{record.Message}</li>")
Next
Response.Write("</ul>")
End Sub
</script>
| 場景 | 實作方式 |
|---|---|
| 寫入資料庫/日誌檔 | 在 OnTraceFinished 中批次 Insert TraceRecords |
| 條件式通知 | 偵測特定錯誤/警告模式,發送 Email/Slack 警報 |
| 效能分析儀表板 | 蒐集 TraceTimestamp 差值,計算各階段耗時,輸出 JSON 供前端圖表 |
| 生產環境安全輸出 | 僅在特定 IP/角色輸出追蹤,避免洩露敏感資訊 |
web.config 啟用追蹤:<trace enabled="true" pageOutput="false" /> (pageOutput=false 避免預設輸出干擾自訂邏輯)。Page.Render 之前觸發,此時 Response 仍可寫入。trace mostRecent="true" requestLimit="100" /> 限制保留筆數。善用 TraceFinished 事件,能將追蹤從被動檢視轉為主動監控與分析平台的資料來源。