我们正在运行一个ELK堆栈来聚合所有日志,并且我们有多个系统。当前,我们已将Filebeat配置为根据系统(SystemA,SystemB,SystemC)登录到特定索引。
此外,我想将所有错误级别为ERROR的日志发送到另一个索引,在该索引中我希望收集系统中的所有错误,但是以某种方式我无法弄清楚如何使Filebeat将一条消息发送到多个索引< / p>
根据the documentation,匹配的第一个条件将定义要使用的索引,这对我来说听起来好像不可能发送将多个模式匹配到多个索引的消息?
我想做什么:
output.elasticsearch:
hosts: '${ELASTICSEARCH_HOSTS}'
username: '${ELASTICSEARCH_USERNAME}'
password: '${ELASTICSEARCH_PASSWORD}'
index: "filebeat-external-%{+yyyy.MM.dd}"
indices:
- index: "filebeat-error-logs-%{+yyyy.MM.dd}"
when:
or:
- equals:
level: "ERROR"
- equals:
level: "error"
- index: "filebeat-service-a-%{+yyyy.MM.dd}"
when:
regexp:
container.name: "^service-a-"
- index: "filebeat-service-b-%{+yyyy.MM.dd}"
when:
regexp:
container.name: "^service-b-"
我目前看到的唯一方法是每个系统有多个索引,并将它们汇总到Kibana中:
output.elasticsearch:
hosts: '${ELASTICSEARCH_HOSTS}'
username: '${ELASTICSEARCH_USERNAME}'
password: '${ELASTICSEARCH_PASSWORD}'
index: "filebeat-external-%{+yyyy.MM.dd}"
indices:
- index: "error-log-service-a-%{+yyyy.MM.dd}"
when:
and:
- equals:
level: "ERROR"
- regexp:
container.name: "^service-a-"
- index: "service-log-service-a-%{+yyyy.MM.dd}"
when:
and:
- not:
- equals:
level: "ERROR"
- regexp:
container.name: "^service-a-"
但是这会使索引数量翻倍,并且是代码重复。我是否在这里遗漏了一些东西,是否有更简单的方法来拥有常规的错误索引,但仍然有错误转到特定于服务的索引?