适用版本: 6.8-8.x
1. 错误说明 #
报错 failed to parse indices privileges for role [<role>]. expected <token1> or <token2> but got <token3> 表示 Elasticsearch 在解析索引权限对象内部结构时,读取到了不符合当前位置语法的 JSON token。
这类异常通常发生在对象层级、数组边界或字段值起始位置被写错时。也就是说,问题不一定是字段名本身错误,而是 JSON 结构在当前位置已经“跑偏”。
2. 常见触发场景 #
- 少写或多写了
{}、[],导致解析器在对象内部读到数组结束或字符串值。 - 手工维护角色 JSON 时多了逗号、少了字段包裹层。
- 程序按字符串拼接 JSON,结果 token 顺序被破坏。
错误示例:
{
"indices": [
{
"names": ["logs-*"],
"privileges": ["read"],
"field_security": ["message"]
}
]
}
上例中如果某字段本应是对象,却给了数组,就可能触发此类 token 级别的解析异常。
3. 排查方法 #
- 先校验 JSON 是否语法合法。
- 再检查异常附近的字段,确认当前位置本应是对象、数组还是普通值。
- 如果角色配置由多段模板拼接,逐段输出中间结果,找到 token 顺序被破坏的位置。
- 对比一个已知可用的角色定义,检查层级和括号是否一致。
4. 修复方法 #
- 按 Elasticsearch 角色 API 期望的 JSON 结构重写出错字段。
- 不要手工拼接 JSON 字符串,改用可靠的序列化器或结构化对象。
- 对可选字段也要保持类型稳定,避免有时输出对象、有时输出数组。
5. 预防建议 #
- 为角色定义启用 JSON Schema 或单元测试校验。
- 在发布前做一次角色 API 回放,尽早暴露 token 级解析问题。
- 统一采用结构化配置生成器,减少人工维护复杂 JSON 的概率。
相关错误 #
附:日志上下文 #
token);
}
}
} while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT);
} else {
throw new ElasticsearchParseException("failed to parse indices privileges for role [{}]. expected {} or {} but got {}" +
" in \"{}\"".""; roleName; XContentParser.Token.START_OBJECT;





