问题描述
我使用的是 AWS ElasticSearch 7.9。我正在使用安装在 Elastic Beanstalk AMI2 上的 Filebeat 7.12 将日志推送到它。
我的日志结构如下:
{
"timestamp": "2021-04-07T22:58:08.012Z","label": "My API","level": "info","module": "server","message": "API is starting in production mode. Version 2.74.0","Metadata": {
"foo": {
"bar": "anything"
}
}
}
我想要的是 ElasticSearch 停止索引 Metadata
字段,因为它可以是任何东西。它用于记录任意对象时的调试目的。
我尝试通过为该字段添加显式声明来使用 API 更新 ElasticSearch 上的模板(ecs ans filebeat)
"mappings" : {
"_Meta" : {
"beat" : "filebeat","version" : "7.12.0"
},"properties" : {
"Metadata": {
"type": "object","enabled": false
},...
我的 filebeat 配置:
filebeat.inputs:
- type: log
paths:
- /var/log/web.stdout.log
json.keys_under_root: true
json.add_error_key: true
output.elasticsearch:
hosts: ["https://somurl.es.amazonaws.com:443"]
username: "username"
password: "password"
index: "my_api-filebeat-%{[agent.version]}-%{+yyyy.MM.dd}"
setup.template.name: "filebeat"
setup.template.pattern: "filebeat-*"
setup.template.append_fields:
- name: Metadata
type: object
enabled: false
setup.ilm.enabled: false
然而,字段 Metadata
不断被编入索引,我最终得到了很多毫无意义的索引,当然还有冲突,因为有些字段在两个日志上没有相同的类型。
我有什么地方做错了吗?
解决方法
您走在正确的轨道上,但此类更新调用将被视为 a breaking change 引发异常 the [enabled] parameter can't be updated for the object mapping [metadata]
。
同时,单个映射属性不能被删除,所以努力将旧的元数据复制到一个新的临时字段中,然后删除原始字段映射,然后将临时内容复制回原始的、尚未更新的{ {1}} 字段将是徒劳的...
因此,唯一的选择是创建一个具有 metadata
属性的新索引,将您的日志重新索引到该新索引中,并将即将到来的日志流重新路由到新索引。 >
长话短说:离开它一段时间后,我终于找到了导致问题的原因。
在我的 filebeat 配置中,我使用了 Elasticsearch 无法识别的索引模式 my_api-filebeat-%{[agent.version]}-%{+yyyy.MM.dd}
,因为默认模板的索引模式是 filebeat-*
。
在我的 filebeat 配置文件中将我的索引模式重命名为 filebeat-my_api-%{[agent.version]}-%{+yyyy.MM.dd}
就像一个魅力!