ES 处理日志字段超出 1000 引发的报错

推荐阅读

Helm3(K8S 资源对象管理工具)视频教程:https://edu.csdn.net/course/detail/32506
Helm3(K8S 资源对象管理工具)博客专栏:https://blog.csdn.net/xzk9381/category_10895812.html

本文原文链接:https://blog.csdn.net/xzk9381/article/details/114630302,转载请注明出处。如有发现文章中的任何问题,欢迎评论区留言。

ES 集群的日志记录中经常会发现如下报错信息:

[2021-02-04T22:40:06,673][DEBUG][o.e.a.a.i.m.p.TransportPutMappingAction] [m-7416] failed to put mappings on indices [[[nginx-server-log-000022/dQLTO5UGQKOUVRn2FnS3Zw]]], type [_doc]
java.lang.IllegalArgumentException: Limit of total fields [1000] in index [nginx-log-000022] has been exceeded

其中的关键报错信息是 Limit of total fields [1000] in index [nginx-server-log-000022] has been exceeded,触发这个报错的原因是由于该日志是 JSON 类型,而 ES 默认 JSON 类型日志 index 的最大字段长度为 1000,但是当前业务的日志中很多都超过了 1000 个字段。

之所以默认最大 1000 个字段,是因为索引中定义太多的字段可能会导致 mapping 的激增,从而引起内存的错误和难以恢复的情况。所以解决这个问题的方式有两个:

  1. 需要业务开发人员精简字段数,控制在 1000 以下
  2. 调整默认字段数限制

这里使用第二种方式来解决这个问题,在 Kibana 中执行如下命令可以为指定索引修改限制:

PUT nginx-server-log/_settings
{
  "index.mapping.total_fields.limit": 2000
}

也可以为所有的索引都修改配置:

PUT _all/_settings
{
  "index.mapping.total_fields.limit": 2000
}

在创建索引的时候也可以直接指定配置,避免后续再进行修改:

PUT _template/ngx-server
{
  "index_patterns": ["ngx-server-*"],
  "settings": {
    "number_of_shards": 15,
    "number_of_replicas": 1,
    "index.lifecycle.name": "ngx-api-normal",
    "index.lifecycle.rollover_alias": "ngx-server",
    "index.mapping.total_fields.limit": 2000
  }
}

本文原文链接:https://blog.csdn.net/xzk9381/article/details/114630302,转载请注明出处。如有发现文章中的任何问题,欢迎评论区留言。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

店伙计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值