Graylog: 資料對應問題

如何解決 Graylog 索引資料對應問題

👋 歡迎瀏覽 Stackhero 文件

Stackhero 提供全託管的 Graylog cloud 方案,專為高效與簡易而設。您可以:

  • 依賴隨服務附送的無限量、專屬 SMTP 電郵伺服器
  • 只需一鍵即可輕鬆更新,無需手動操作。
  • 使用受 HTTPS 保護的自訂網域名稱(例如 https://logs.your-company.com),讓您的團隊安全直接存取。
  • 專屬私人基礎設施上享有卓越效能安全性,無需與他人共用資源,亦無「嘈吵鄰居」問題。

專注於您的數據,而非工具管理:只需數分鐘,即可開始使用 Stackhero 的 Graylog cloud hosting 方案。

在 Graylog 中,一個常見的問題是資料對應(mapping)衝突,這會導致索引失敗。當您看到類似以下的日誌時,可能就遇到了這個問題:

ElasticsearchException[Elasticsearch exception [type=mapper_parsing_exception, reason=failed to parse field [level] of type [long] in document with id '34fd4d11-36ed-11f0-afc9-0242ac140002'. Preview of field's value: 'error']]; nested: ElasticsearchException[Elasticsearch exception [type=illegal_argument_exception, reason=For input string: "error"]];

這個問題源於 OpenSearch 的動態對應(dynamic mapping)功能。動態對應會根據寫入索引的第一份文件,自動判斷每個欄位的資料類型。一旦資料類型被設定,該欄位的型別就會被「鎖定」,之後如果有文件傳入同一欄位但資料型別不同,就會被拒絕,並產生 mapper parsing exception。

當新索引建立時,第一份文件會決定索引的 mapping。例如,如果該文件的「level」欄位值為 3(數值),OpenSearch 會將「level」的資料型別設定為「long」(數值型別)。如果之後有文件傳送到 Graylog,該文件的「level」欄位值為「error」(字串型別),就會因為資料型別不一致而被拒絕,並觸發 mapper_parsing_exception,錯誤訊息為 failed to parse field [level] of type [long] in document with id 'xxx'.

如果不同文件之間欄位的資料型別不一致,這個問題可以發生在任何欄位上。

要解決這個問題,您有兩個選擇:

最理想的做法是統一所有發送到 Graylog 的系統所使用的欄位資料型別。例如,確保「level」欄位要麼始終以字串(如「error」、「warn」等)傳送,要麼始終以數字(如 3、4 等)傳送。這種一致性可以避免 mapping 衝突,確保所有文件都能正確寫入。

如果無法在所有系統中統一資料型別,您可以利用 Graylog 的 Pipelines 功能,在資料進入時進行型別轉換。Pipelines 允許您根據特定條件定義規則,對資料進行轉換。

實作步驟如下:

  • 在 Graylog 網頁介面中,前往「System」>「Pipelines」。
  • 點擊「Add new pipeline」建立新 Pipeline。
  • 定義規則,將「level」欄位(或其他欄位)轉換為所需的資料型別。例如,您可以將數值型的 level 轉換為對應的字串(如 3 轉為「error」、4 轉為「warning」等)。

這種方式可以確保所有進入的資料都符合預期的資料型別,避免 mapping 衝突。

對於進階用戶,Graylog 也提供檢視及手動調整索引 mapping 的功能:

  • 在 Graylog 網頁介面中,前往「System」>「Indices」。
  • 選擇相關索引。
  • 前往「Configuration」>「Configure index field types」以檢視或修改欄位 mapping。

不過,手動調整 mapping 時請務必小心,因為錯誤的 mapping 可能會導致更多資料寫入問題。