自訂 1.6.x 記載代理程式,以支援在協調環境中使用 Winston 的 Node.js 應用程式的自訂多行解析功能

本教學示範如何使用自訂的 Winston 日誌函式庫,為 Node.js 應用程式設定 IBM® Cloud Logs 記載代理程式 多行日誌處理。 此設定適用於協調環境,例如 IBM Cloud Kubernetes Service 和 Red Hat OpenShift on IBM Cloud,並使用 Helm。 此設定可確保堆疊追蹤和多行日誌在 IBM Cloud Logs 中正確歸類。

本教學需要 IBM Cloud Logs 記載代理程式 1.6.0 或更新版本。

開始之前

在開始使用本教學之前,請檢閱下列資訊,以瞭解 記載代理程式 和多行概念。

本教學也假設您有:

Winston 組態範例

假設您的 Node.js 應用程式使用 Winston,並以下列格式記錄到主控台:

const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(
    winston.format.timestamp({
      format: 'ddd MMM DD YYYY HH:mm:ss.SSS'
    }),
    winston.format.errors({ stack: true }),
    winston.format.printf(({ timestamp, level, message, stack }) => {
      const levelUpper = level.toUpperCase();
      const baseLog = `[${timestamp}] ${levelUpper} [Main] - ${message}`;
      if (stack) {
        return `${baseLog}\n${stack}`;
      }
      return baseLog;
    })
  ),
  transports: [
    new winston.transports.Console()
  ]
});

此格式產生的日誌項目以時間戳記和層級開頭,多行日誌 (例如錯誤堆疊追蹤) 則在後續行中跟隨,不含時間戳記。

Winston 通常會將所有輸出 (包括錯誤堆疊追蹤) 記錄為單一字串,因此通常不需要多行解析器。 不過,這個範例展示了如果您的格式化器列印多行日誌時該怎麼做,也有助於說明如何處理任何自訂格式的多行解析。

提供此設定作為範例,說明使用自訂記錄格式時,如何處理多行記錄。 如果您的應用程式使用不同的結構或記錄函式庫,請以此作為參考,據此建立您自己的多行解析器。

設定多行解析與 Helm

如果您使用 Helm 部署 記載代理程式,您可以在 Helm values.yaml 檔案中設定多行解析。

啟用多行解析

values.yaml 檔案中設定 enableMultilinetrue,以啟動多行處理:

enableMultiline: true

定義多行解析器

values.yaml 檔案的 additionalMultilineParsers 區段下新增自訂多行解析器。

log4j.xml 檔案中定義的模式必須與多行解析器中的 regex 一致,以確保正確的日誌群組。

additionalMultilineParsers:
  - name: multiline-nodejs-winston
    type: regex
    flush_timeout: 500
    rules:
      - state: start_state
        regex: '/^\[[A-Z][a-z]{2} [A-Z][a-z]{2} \d{2} \d{4} \d{2}:\d{2}:\d{2}\.\d{3}\] .*$/'
        next_state: cont
      - state: cont
        regex: '/^(?!\[[A-Z][a-z]{2} [A-Z][a-z]{2} \d{2} \d{4} \d{2}:\d{2}:\d{2}\.\d{3}\] ).*$/'
        next_state: cont

此 regex 假定每一行新日誌都以格式為 ddd MMM DD YYYY HH:mm:ss.SSS 的時間戳開始。 第一條規則擷取具有時間戳記的起始行,並移動到延續狀態。 第二條規則會匹配任何不是以時間戳開始的行。

這個方法只是一個範例,向您展示如何確保在將多行記錄行轉送至 IBM Cloud Logs 之前,先將它們群組為單一記錄項目。 有不同的方法可以達到相同的目的。

在預處理器中應用解析器

multilinePreprocessor 區段下設定預處理器,將解析器套用至您的日誌。

例如:

multilinePreprocessor:
  - name: multiline
    multiline.parser: multiline-nodejs-winston
    multiline.key_content: log

套用變更。

如果您已安裝先前版本的 記載代理程式,並透過直接在群集中修改配置映射更新了代理程式組態,請在執行 helm upgrade 指令之前,先從群集中複製一份配置映射。 更新 記載代理程式 時,對設定映射所做的任何變更都會被覆蓋。

更新 values.yaml 檔案後,在您的部署上執行下列步驟,套用變更。 這將會重新產生必要的設定。

helm upgrade

驗證您的多行日誌

存取您的 IBM Cloud Logs 範例,並確認您的多行項目(例如堆疊追蹤)已正確分組。

  1. 存取您的 IBM Cloud Logs 實例。

  2. 使用日誌 探索日誌圖示 檢視,驗證您的多行項目是否已正確分組。