Graylog: 数据映射问题

如何解决 Graylog 索引数据映射问题

👋 欢迎使用 Stackhero 文档!

Stackhero 提供即用型 Graylog 云 解决方案,具有众多优势,包括:

  • 包含无限制和专用的 SMTP 电子邮件服务器
  • 只需点击即可轻松完成更新
  • 使用 HTTPS 保护的可定制域名(例如,https://logs.your-company.com)。
  • 专用私有 VM提供的最佳性能和强大安全性

节省时间简化您的生活:只需 5 分钟即可试用 Stackhero 的 Graylog 云托管 解决方案!

在 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'.

如果同一字段在不同文档中数据类型不一致,任何字段都可能出现此问题。

您可以通过以下两种方式解决该问题:

理想的解决方案是,统一所有向 Graylog 发送数据的系统中各字段的数据类型。例如,确保 "level" 字段始终以字符串(如 "error"、"warn" 等)或始终以数字(3、4 等)形式发送。保持数据类型一致可避免映射冲突,确保所有文档都能被正确写入。

如果无法在所有系统间统一数据类型,您可以利用 Graylog 的 Pipelines 功能,在数据接收时进行类型转换。Pipelines 允许您根据特定条件定义规则,对数据进行转换。

具体操作如下:

  • 在 Graylog Web 界面进入 "System" > "Pipelines"。
  • 点击 "Add new pipeline" 创建新 Pipeline。
  • 定义规则,将 "level" 字段(或其他字段)转换为所需的数据类型。例如,可以将数值型 level 转换为对应的字符串(如 3 转为 "error",4 转为 "warning" 等)。

通过这种方式,所有接收的数据都能符合预期的数据类型,避免映射冲突。

对于高级用户,Graylog 支持查看和手动调整索引的字段映射:

  • 在 Graylog Web 界面进入 "System" > "Indices"。
  • 选择相关索引。
  • 进入 "Configuration" > "Configure index field types",即可查看或修改字段映射。

但请注意,手动修改映射需谨慎操作,错误的映射配置可能导致新的数据写入问题。