CloudFlare Workers 日誌管理方案全解析

LexLuc發表於2024-08-20

摘要

本文全面介紹了CloudFlare Workers的多種日誌管理方案,包括Logpush、Tail Workers、實時日誌以及手動傳送日誌。文章詳細分析了每種方案的特點、優缺點和使用步驟。針對低成本、可整合Sentry、支援自定義傳送日誌的實際專案需求,文章推薦採用手動傳送日誌到Sentry的方案。該方案不僅滿足成本控制要求,還提供了強大的錯誤跟蹤和效能監控功能。文章最後提供了具體的實現步驟和程式碼示例,為開發者選擇合適的日誌管理策略提供了有價值的參考。

目錄

  1. 引言
  2. Logpush
    1. 介紹
    2. 推送目標
    3. 操作步驟
  3. Tail Workers
    1. 介紹
    2. 操作步驟
  4. 實時日誌
    1. 介紹
    2. 使用方法
    3. 侷限性
  5. 替代方案:手動傳送日誌
    1. 實現方式
    2. 注意事項
  6. 方案選擇
    1. 推薦方案:手動傳送日誌到Sentry
  7. 總結

引言

在開發和維護 CloudFlare Workers 時,日誌管理是一個至關重要的環節。本文將詳細介紹 CloudFlare 提供的幾種日誌管理方案,包括 Logpush、Tail Workers 和實時日誌,以及一些替代方案。我們將深入探討每種方法的特點、優缺點和使用步驟,以便選擇最適合自己需求的日誌管理策略。

1. Logpush

1.1 介紹

Cloudflare Logpush 是一個強大的日誌推送服務,支援將 Workers Trace Events(包括日誌資訊)傳送至多種受支援的目標位置。Workers Trace Events 包含了請求和響應的後設資料、非結構化的 console.log() 訊息以及任何未捕獲的異常,為開發者提供了全面的日誌資訊。

注意:使用 Logpush 需要訂閱 Workers Paid plan。

1.2 推送目標

Logpush 支援多種推送目標,可以滿足不同場景下的需求:

  1. 儲存服務

    • Cloudflare R2
    • Amazon S3
    • S3-compatible endpoints
    • Google Cloud Storage
    • Microsoft Azure
    • BigQuery
  2. SIEM 或日誌管理服務商

    • Datadog
    • Elastic
    • IBM QRadar
    • New Relic
    • Splunk
    • Sumo Logic
  3. 其它日誌服務

    • HTTP destination
    • Other providers

1.3 操作步驟

  1. 建立 Logpush Job:在 CloudFlare 控制檯完成設定。
  2. 設定 wrangler.toml:新增 logpush = true,啟用 CF Worker 的 Logpush 功能。

2. Tail Workers

2.1 介紹

Tail Worker 是一種特殊的 Worker,可以接收其他 Workers(稱為 producer Workers)的執行資訊,包括 HTTP 狀態、傳遞給 console.log() 的資料或未捕獲的異常。Tail Workers 可用於處理日誌,實現告警、除錯或分析功能。

注意:使用 Tail Workers 需要訂閱 Workers Paid plan 或 Enterprise tiers。

2.2 操作步驟

  1. 建立一個 Worker 作為 Tail Worker。
  2. 在 Tail Worker 中增加 tail() handler。示例程式碼如下:
export default {
  async tail(events) {
    fetch("https://example.com/endpoint", {
      method: "POST",
      body: JSON.stringify(events),
    })
  }
}
  1. 將 Producer Worker 關聯到 Tail Worker:在 wrangler.toml 中新增以下配置:
tail_consumers = [{service = "<TAIL_WORKER_NAME>"}]

3. 實時日誌

3.1 介紹

Workers 平臺會捕獲所有的 console.log 記錄和未捕獲的異常,以及關於事件本身的資訊。這些日誌可以在 CF 控制檯或透過命令列工具實時檢視,適合在使用者使用時進行實時觀察。

3.2 使用方法

  • 在 CF 控制檯檢視
  • 使用命令列工具:npx wrangler tail

3.3 侷限性

  • 無法持久化儲存
  • 高負載時會進入取樣模式,可能導致日誌丟失
  • 最多支援 10 個客戶端同時觀察日誌

4. 替代方案:手動傳送日誌

除了上述三種方法,還可以考慮透過 HTTP 請求手動傳送日誌資訊到第三方日誌服務(如 Sentry)。

4.1 實現方式

export default {
  async fetch(request, env, ctx) {
    function postLog(data) {
      return fetch("https://log-service.example.com/", {
        method: "POST",
        body: data,
      });
    }

    // 使用 ctx.waitUntil() 確保日誌記錄完成
    ctx.waitUntil(postLog(stack));
    return fetch(request);
  }
}

4.2 注意事項

一旦 Worker 向客戶端返回響應,未完成的非同步任務將被取消。為了確保日誌記錄的子請求能夠完成,需要將請求的 Promise 傳遞給 event.waitUntil()

5. 方案選擇

基於實際專案需求(低成本、可整合Sentry、接受修改程式碼從而支援自定義傳送日誌),我們可以對上述方案進行評估:

  1. Logpush

    • 優點:功能強大,支援多種目標。
    • 缺點:需要付費,不符合低成本需求。
    • 評估:不推薦
  2. Tail Workers

    • 優點:可用於實時處理和分析日誌。
    • 缺點:需要付費,不符合低成本需求。
    • 評估:不推薦
  3. 實時日誌

    • 優點:免費,易於使用。
    • 缺點:不支援持久化儲存,無法整合Sentry,不支援自定義傳送日誌。
    • 評估:可作為開發除錯時的輔助工具,但不適合作為主要的日誌管理方案。
  4. 手動傳送日誌

    • 優點:低成本(僅需要少量額外的計算資源),可以自定義傳送日誌,可以輕鬆整合Sentry。
    • 缺點:需要修改程式碼,可能會略微增加請求處理時間。
    • 評估:最符合需求,推薦使用。

推薦方案:手動傳送日誌到Sentry

基於專案需求,我們推薦採用手動傳送日誌的方案,並將日誌傳送到Sentry。以下是實現步驟:

  1. 註冊Sentry賬戶並建立專案,獲取DSN(Data Source Name)。

  2. 在Worker中整合Sentry SDK。你可以使用Sentry的JavaScript SDK,或者使用專門為Cloudflare Workers最佳化的輕量級版本。

  3. 修改Worker程式碼,新增日誌記錄和錯誤捕獲邏輯。示例如下:

import * as Sentry from '@sentry/cloudflare-workers';

Sentry.init({
  dsn: 'YOUR_SENTRY_DSN',
  tracesSampleRate: 1.0,
});

export default {
  async fetch(request, env, ctx) {
    try {
      // 記錄請求資訊
      Sentry.addBreadcrumb({
        category: 'request',
        message: `${request.method} ${request.url}`,
        level: 'info',
      });

      // 主要業務邏輯
      const response = await handleRequest(request);

      // 記錄響應資訊
      Sentry.addBreadcrumb({
        category: 'response',
        message: `Status: ${response.status}`,
        level: 'info',
      });

      return response;
    } catch (error) {
      // 捕獲並報告錯誤
      Sentry.captureException(error);
      return new Response('Internal Server Error', { status: 500 });
    } finally {
      // 確保日誌被髮送
      ctx.waitUntil(Sentry.flush(2000));
    }
  }
};
  1. 使用wrangler部署更新後的Worker。

這種方案既滿足了低成本需求(Sentry提供免費套餐),又支援自定義日誌傳送,同時還整合了強大的錯誤跟蹤和效能監控功能。

總結

CloudFlare Workers提供了多種日誌管理方案,每種方案都有其特點和適用場景。根據實際專案需求(低成本、可整合Sentry、支援自定義傳送日誌),我們推薦採用手動傳送日誌到Sentry的方案:

  1. 手動傳送日誌到Sentry:透過整合Sentry SDK,可以實現低成本、自定義的日誌管理。這種方法不僅滿足了基本的日誌記錄需求,還提供了強大的錯誤跟蹤和效能監控功能。

  2. 實時日誌:雖然不適合作為主要的日誌管理方案,但可以作為開發和除錯過程中的有力輔助工具。

  3. Logpush和Tail Workers:這兩種方案功能強大,但由於成本因素,不適合當前的專案需求。

實際專案需求是低成本、日誌可持久化、支援第三方日誌服務、接受修改程式碼從而支援自定義傳送日誌。透過採用手動傳送日誌到Sentry的方案,既可以實現高效的日誌管理和錯誤跟蹤,又能控制成本,為CloudFlare Workers的開發和維護提供有力支援。

相關文章