自訂 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 或更新版本。
開始之前
在開始使用本教學之前,請檢閱下列資訊,以瞭解 記載代理程式 和多行概念。
本教學也假設您有:
-
已配置的 IBM Cloud Logs 實例。
-
記載代理程式 部署在協調環境中。
-
Kubernetes Service IBM Cloud Kubernetes Service
-
Red Hat OpenShift on IBM Cloud Red Hat OpenShift on IBM Cloud
-
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 檔案中設定 enableMultiline 為 true,以啟動多行處理:
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 範例,並確認您的多行項目(例如堆疊追蹤)已正確分組。
-
使用日誌
檢視,驗證您的多行項目是否已正確分組。