1. 介紹
在深入實作之前,我們先搞清楚為什麼需要外部系統來收集日誌。想像你的應用程式不是跑在家裡的電腦,而是在生產環境:上百台伺服器、微服務、多數使用者,有人抱怨 "應用程式卡住了"。要在海量日誌中找到那個事件,就像在草堆裡找針。沒有集中式日誌收集,要除錯和維運這種系統幾乎不可能。這時候 Seq 和 Application Insights 就派上用場了。
Seq:好用的 UI、快速搜尋、即時流
Seq 是專門用來收集和分析結構化日誌的系統,特別適合 .NET 和 Serilog。它不只是把日誌檔丟到某處,而是一套強大的工具:能即時看到日誌流、依屬性過濾與搜尋、建立警報。Seq 可本地部署或在雲端運行。
為什麼選 Seq?
- 為 .NET 和 Serilog 做了最佳化,開箱即用。
- 超快的搜尋與任意欄位過濾。
- 簡單且好用的網頁介面。
- 可以本地部署,流程簡單,甚至能在筆電上跑。
簡單的架構長怎樣?
+--------------+ +-------------+ +-------------+
| .NET-應用程式 | --(日誌)| Serilog | --(http)| Seq |
+--------------+ +-------------+ +-------------+
| ^
| |
(搜尋、過濾、 <----[Web UI]
警報、整合)
應用程式透過 Serilog 寫結構化日誌,Serilog 把它們傳到 Seq。你可以在 Seq 的網頁介面上做任何你想做的事。
2. 將 Serilog 整合到 Seq
安裝 Seq
可以在本機快速試用 Seq 做實驗。例如在 Windows 上可以從官方網站下載 Seq。
- 下載 Seq 並安裝。
- 安裝後打開網頁介面(通常是 http://localhost:5341)。
- 完成!接下來設定把日誌傳到 Seq。
把 Serilog 整合到 Seq
安裝 NuGet 套件:
dotnet add package Serilog.Sinks.Seq
在 Program.cs 中的範例設定:
using Serilog;
public class Program
{
public static void Main(string[] args)
{
// 設定 Serilog 把日誌輸出到 Seq
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Information()
.WriteTo.Console()
.WriteTo.Seq("http://localhost:5341") // 你 Seq 伺服器的 URL
.CreateLogger();
Log.Information("應用程式啟動中");
// ... 其他應用程式程式碼 ...
Log.CloseAndFlush();
}
}
如果一切設定正確,你的應用程式日誌就會開始流進 Seq。
結構化事件範例
Log.Information("用戶 {User} 已登入於 {Time}", userName, DateTime.UtcNow);
在 Seq 裡現在可以搜尋某個使用者的所有登入事件:
User == 'vasya'
過濾與搜尋
Seq 可以依任何欄位和值過濾事件。例如,要看今天的所有錯誤,只要下這個過濾條件:
@Level = 'Error' and @Timestamp > today()
條件可以自由組合——超級方便!
警報與整合
Seq 能建立警報:例如當錯誤數超過門檻,你會收到 email、觸發 webhook,甚至發訊息到 Slack。
還有什麼功能?
- 與 CI/CD 系統整合,自動收集測試日誌。
- 自訂 Dashboard(部分功能可能付費)。
- 日誌分析插件、自動化動作(例如發現崩潰時自動建立 bug)。
- 透過插件與 Grafana/Prometheus 整合。
設定 Seq 時常見錯誤
常見問題之一是沒正確設定 Serilog 裡的 Seq URL,或 Seq 伺服器在不同的 port 上聽取。
另一個問題是在 Docker 或遠端伺服器上沒開放入口 port。務必從應用程式所在的環境檢查能否連到 Seq 的 port。
3. Application Insights:用於 .NET 的遙測、雲端與魔法
Application Insights(或稱 "App Insights")是 Microsoft Azure 提供的雲端監控與應用程式分析平台。它不僅收集日誌,還能自動偵測異常、分析使用情況、監控相依性、requests、外部 API,並提供即時視覺化。對 enterprise 等級的 .NET 應用來說,Azure 的 Application Insights 已是標準配備。
Application Insights 的優點
- 不需另外架伺服器:都在雲端。
- 與 .NET、ASP.NET、Azure、Visual Studio 深度整合。
- 自動收集日誌以外的指標、例外、requests、SQL 查詢等。
- 可以建立儀表板、監控 SLA、找異常、分析分散式追蹤 (distributed tracing)。
Application Insights 怎麼運作?
+--------------+ +-------------------+ +---------------------+
| .NET-應用程式 | --(SDK)| AppInsights SDK | --(https)| Azure Application |
+--------------+ +-------------------+ | Insights (雲端) |
+---------------------+
^ |
(W3C Trace +----> 分析、搜尋、面板
Context)
裝了 SDK 的應用程式會把遙測資料發到 Azure,你再透過 Azure 入口網站的網頁介面來分析與視覺化。
在 .NET 應用中整合 Application Insights
方案 1:快速又簡單
如果你是 ASP.NET Core 應用,整合很簡單:
dotnet add package Microsoft.ApplicationInsights.AspNetCore
在 Program.cs 中:
builder.Services.AddApplicationInsightsTelemetry("<你的_InstrumentationKey>");
如果是主控台或桌面應用:
dotnet add package Microsoft.ApplicationInsights
初始化:
using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.Extensibility;
var telemetryConfig = TelemetryConfiguration.CreateDefault();
telemetryConfig.InstrumentationKey = "<你的_InstrumentationKey>";
var telemetryClient = new TelemetryClient(telemetryConfig);
telemetryClient.TrackTrace("Hello from Application Insights!");
telemetryClient.TrackException(new Exception("ОПС, 發生錯誤!"));
Instrumentation Key 要在 Azure 入口網站創建 Application Insights 資源後取得。
如何傳送結構化資料?
你可以在每筆 trace 裡加上屬性:
telemetryClient.TrackTrace("使用者已登入",
new Dictionary<string, string> { ["User"] = userName }
);
範例:記錄使用者操作
假設你要記錄使用者登入:
var props = new Dictionary<string, string>
{
{ "User", userName },
{ "Time", DateTime.UtcNow.ToString("o") }
};
telemetryClient.TrackEvent("UserLogin", props);
現在不只有事件本身,相關屬性也會在入口網站看到。
4. 有用的細節
在 Application Insights 你會看到什麼?
- 應用總覽:進入量、錯誤、相依性(例如 SQL 查詢)。
- 日誌搜尋:任意事件與依屬性過濾。
- 視覺化:圖表、儀表板。
- Tracing:可看呼叫鏈與每步驟耗時。
- Alerting:可依任何條件設定警報。
簡述 Application Insights 的資料結構
| 物件 | 描述 |
|---|---|
| Trace | 字串訊息(一般日誌)。 |
| Event | 任意事件(例如 "購買")。 |
| Exception | 錯誤/例外的資訊。 |
| Dependency | 外部呼叫(SQL、HTTP 請求等)。 |
| Metric | 數值指標(例如計數)。 |
| Request | 使用者的請求(針對網頁應用)。 |
範例:在 Application Insights 搜尋錯誤
在 Azure 入口網站你可以寫簡單的查詢(Kusto Query Language — KQL):
exceptions
| where timestamp > ago(1d)
| where outerMessage contains "Timeout"
| project timestamp, operation_Name, user_Id, outerMessage
這會列出過去一天內所有包含 "Timeout" 的超時錯誤,並顯示細節。
Application Insights 的限制與注意事項
- 需要 Azure 帳號。可以用免費方案,但有使用上限。
- 有時從送出日誌到 UI 顯示會有幾分鐘的延遲。
- 如果專案非常私密,記得這是雲端服務,不是本地部署。
- 濫用 trace 會快速耗盡每日配額,要注意取樣或限制量級。
5. Seq 與 Application Insights 比較
| Seq | Application Insights | |
|---|---|---|
| 存放位置 | 本地伺服器(或雲端) | Azure 雲端 |
| 成本 | 本地可免費/付費 | 有免費額度,但在 Azure 上是付費的 |
| 最佳應用 | .NET 應用、本地 CI | 任何應用,生產/企業級 |
| UI/搜尋 | 非常直覺,支援過濾 | 強大,含分析與儀表板 |
| Alerting | 內建 | 可做複雜條件,與 Azure 深度整合 |
| 整合 | Serilog 與其他 sinks | 提供 ASP.NET, .NET, JS 等 SDK |
| 彈性 | 你自己掌控 | 由 Microsoft 管理 |
把知識用到實務中
懂得使用 Seq 和 Application Insights 的技巧,不只對生產環境有幫助,也能在開發、測試階段(例如分析自動化測試行為)派上用場。處理微服務時,你會想看到整體情況。在面試時常被問到 "你會怎麼組織日誌收集,讓在生產環境能快速定位問題?" ——現在你有答案了!
另外,很多公司會把這些系統串成完整的 DevOps 流程:Continuous Delivery、依 alerts 自動建立 bug 等。日誌收集系統不是單純的 "Console.WriteLine 去哪了",而是真正的黑盒與應用監控工具。
GO TO FULL VERSION