Graylog: 处理 "failed to parse field [XXXX] of type [YYYY]" 错误

本文件是入门指南指南的一部分。您可以在这里查看完整指南:如何开始使用 Graylog

👋 欢迎查阅 Stackhero 文档

Stackhero 提供全托管的 Graylog cloud 解决方案,专为高效与简便而设计。您可以:

  • 依赖于服务内置的无限制专用 SMTP 邮件服务器
  • 只需一键即可轻松完成更新,无需手动操作。
  • 使用由HTTPS保护的自定义域名(例如 https://logs.your-company.com),为您的团队提供安全、直接的访问。
  • 专属私有基础设施上获得卓越的性能安全性,无共享资源,无干扰邻居。

专注于您的数据,而非工具本身:只需几分钟,即可开始使用 Stackhero 的 Graylog cloud hosting 解决方案。

您可能会遇到如下错误:

org.opensearch.index.mapper.MapperParsingException: failed to parse field [time] of type [long] in document with id 'xxxx'

您可以在 Stackhero 控制台提供的日志中,或在 Graylog 管理后台 System > Overview > Indexer failures 查看此错误。

该错误表明某条日志的 time 字段值与预期类型不符(此处应为 "long" 类型的数值)。Graylog 利用 OpenSearch 的动态映射功能。当首次收到日志时,OpenSearch 会尝试自动推断字段类型。例如,如果日志中的 time 字段为数值 1234,OpenSearch 会将其定义为数值类型。如果后续日志的 time 字段为字符串 "abcd",OpenSearch 会因类型不符而拒绝该日志。

请注意,time 字段名仅为示例,实际可为任意字段名和类型。

要解决此问题,您需要重新定义 OpenSearch 期望的字段类型。更多信息请参考 Graylog 官方文档

在操作前,请先在 Stackhero 控制台启用 OpenSearch 访问权限。进入您的 Graylog 服务,点击“Configure”按钮以激活 OpenSearch 访问。

请谨慎操作,错误的配置可能导致 OpenSearch 集群不可用,甚至造成数据丢失。如有疑问,请勿继续。

  1. 定义新的映射。本例中,我们将 time 字段重新定义为 string 类型。可用类型请参考 OpenSearch 字段类型文档

  2. 将以下内容保存为 graylog-custom-mapping.json 文件:

    {
      "template": "graylog_*",
      "mappings": {
        "message": {
          "properties": {
            "time": {
              "type": "string",
              "index": "not_analyzed"
            }
          }
        }
      }
    }
    
  3. 使用以下 curl 命令提交该文件(请将 <XXXXXX>.stackhero-network.com 替换为您的实例域名):

    curl -u 'admin' -X PUT -d @'graylog-custom-mapping.json' -H 'Content-Type: application/json' 'https://<XXXXXX>.stackhero-network.com/opensearch/_template/graylog-custom-mapping?pretty'
    

    您应收到如下响应:

    {
      "acknowledged": true
    }
    
  4. 最后,通过以下命令验证映射是否已更新(如有需要请替换域名):

    curl -u 'admin' -X GET 'https://<XXXXXX>.stackhero-network.com/opensearch/graylog_deflector/_mapping?pretty'