Graylog: 數據映射問題

如何解決 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 的動態映射功能。動態映射會根據寫入索引的第一個文件自動確定每個字段的數據類型。一旦設置,該數據類型就會被“鎖定”,任何未來文件中該字段的不同數據類型都會被拒絕,導致映射解析異常。

當創建新索引時,第一個文件定義了索引映射。例如,如果文件包含一個 "level" 字段,其值為 3(數值),OpenSearch 會將 "level" 的數據類型設置為 "long"(數字類型)。如果後來發送到 Graylog 的文件中 "level" 字段設置為 "error"(字符串類型),則會被拒絕,因為數據類型與最初設置的類型不匹配。這會觸發 mapper_parsing_exception 錯誤,原因是 failed to parse field [level] of type [long] in document with id 'xxx'.

如果文件之間的數據類型不一致,任何字段都可能發生此問題。

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

理想的解決方案是標準化所有系統中字段使用的數據類型。例如,確保 "level" 字段始終以字符串(如 "error"、"warn" 等)或數字(3、4 等)形式發送。這種一致性可以防止映射衝突,確保所有文件正確被接收。

如果無法在所有系統中標準化數據類型,您可以使用 Graylog 的管道在接收時轉換數據類型。管道允許您根據特定條件定義轉換數據的規則。

要實施此解決方案:

  • 在 Graylog 網頁界面中導航到 "System" > "Pipelines"。
  • 點擊 "Add new pipeline" 以創建新管道。
  • 定義規則將 "level" 字段(或其他字段)轉換為所需的數據類型。例如,您可以將數字級別轉換為相應的字符串表示(如 3 為 "error",4 為 "warning" 等)。

此方法確保所有進入的數據符合預期的數據類型,防止映射衝突。

對於高級用戶,Graylog 提供查看和手動調整索引映射的功能:

  • 在 Graylog 網頁界面中進入 "System" > "Indices"。
  • 選擇相關索引。
  • 導航到 "Configuration" > "Configure index field types" 以查看或修改字段映射。

然而,手動調整應謹慎進行,因為不正確的映射可能導致進一步的接收問題。