Graylog: 資料對應(Data Mapping)問題
如何解決 Graylog 索引資料對應問題
👋 歡迎來到 Stackhero 文件!
Stackhero 提供一個即用型的 Graylog cloud 解決方案,帶來多項好處,包括:
- 包含無限和專用的 SMTP 電郵伺服器。
- 只需一鍵即可輕鬆更新。
- 使用 HTTPS 保護的可自訂域名(例如,https://logs.your-company.com)。
- 由專用私有 VM提供的最佳性能和強大安全性。
節省時間並簡化您的生活:只需 5 分鐘即可嘗試 Stackhero 的 Graylog cloud hosting 解決方案!
在 Graylog 中,一個常見的問題是資料對應衝突,這會導致索引失敗。當您看到類似以下的日誌時,可能就遇到了這個問題:
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。
當新索引建立時,第一份文件會決定該索引的對應設定。例如,如果第一份文件的「level」欄位值為 3(數值),OpenSearch 就會將「level」的資料型態設為「long」(數值型態)。如果之後有文件傳送到 Graylog,且「level」欄位的值為 "error"(字串型態),就會因為型態不符而被拒絕,並觸發 mapper_parsing_exception,錯誤訊息為 failed to parse field [level] of type [long] in document with id 'xxx'.
只要同一欄位在不同文件間資料型態不一致,都可能發生這個問題。
解決方式
您有兩種方式可以解決這個問題:
1. 確保所有系統的資料型態一致
最理想的解決方案是統一所有傳送到 Graylog 的系統,所使用欄位的資料型態。例如,確保「level」欄位始終以字串(如 "error"、"warn" 等)或始終以數字(3、4 等)傳送。這種一致性可以避免對應衝突,確保所有文件都能正確寫入。
2. 使用 Graylog Pipeline 進行資料型態轉換
如果無法在所有系統間統一資料型態,您可以利用 Graylog 的 Pipeline 功能,在資料進入時進行型態轉換。Pipeline 允許您根據特定條件定義規則,轉換資料內容。
實作步驟如下:
- 在 Graylog 網頁介面中,前往「System」>「Pipelines」。
- 點選「Add new pipeline」建立新 Pipeline。
- 定義規則,將「level」欄位(或其他欄位)轉換為所需的資料型態。例如,將數值型的 level 轉換為對應的字串(如 3 轉為 "error",4 轉為 "warning" 等)。
這種方式可以確保所有進入的資料都符合預期的資料型態,避免對應衝突。
檢視與修改索引對應設定
對於進階使用者,Graylog 也提供檢視與手動調整索引對應(mapping)的功能:
- 在 Graylog 網頁介面中,前往「System」>「Indices」。
- 選擇相關索引。
- 進入「Configuration」>「Configure index field types」以檢視或修改欄位對應設定。
不過,手動調整對應時請務必謹慎,因為錯誤的對應設定可能導致更多資料寫入問題。