CodeGym /課程 /C# SELF /收集日誌: Seq 和 Application Insights

收集日誌: Seq 和 Application Insights

C# SELF
等級 64, 課堂 2
開放

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。

  1. 下載 Seq 並安裝。
  2. 安裝後打開網頁介面(通常是 http://localhost:5341)。
  3. 完成!接下來設定把日誌傳到 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 去哪了",而是真正的黑盒與應用監控工具。

2
任務
C# SELF, 等級 64, 課堂 2
上鎖
整合 Application Insights 來收集遙測資料
整合 Application Insights 來收集遙測資料
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION