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 的动态映射功能。动态映射会根据写入索引的第一个文档自动确定每个字段的数据类型。一旦设置,该数据类型就会被“锁定”,任何未来文档中该字段的数据类型不同都会被拒绝,导致映射解析异常。
当创建新索引时,第一个文档定义了索引映射。例如,如果文档包含一个值为 3(数值)的 "level" 字段,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 管道进行数据转换
如果无法在所有系统中标准化数据类型,您可以使用 Graylog 的管道在接收时转换数据类型。管道允许您根据特定条件定义数据转换规则。
要实施此解决方案:
- 在 Graylog Web 界面中导航到 "System" > "Pipelines"。
- 点击 "Add new pipeline" 创建新管道。
- 定义规则将 "level" 字段(或其他字段)转换为所需的数据类型。例如,您可以将数值级别转换为相应的字符串表示(如 3 转换为 "error", 4 转换为 "warning" 等)。
这种方法确保所有传入数据符合预期的数据类型,防止映射冲突。
查看和更改索引映射
对于高级用户,Graylog 提供查看和手动调整索引映射的功能:
- 在 Graylog Web 界面中进入 "System" > "Indices"。
- 选择相关索引。
- 导航到 "Configuration" > "Configure index field types" 查看或修改字段映射。
然而,手动调整应谨慎进行,因为不正确的映射可能导致进一步的摄取问题。