如何在Filebeat中使用drop_event丢弃Kubernetes自动发现的含指定关键词的日志
问题原因
你的配置不生效核心是2个常见的Filebeat规则配置误区:
- Filebeat的
regexp匹配默认是全字符串锚定匹配,你写的message: 'GET'只有当整个message字段值完全等于GET时才会触发,无法匹配GET作为子串的日志。 - 全局processors虽然可用,但输入级别的过滤规则优先级更高、性能更好,针对Kubernetes自动发现的容器日志,优先在采集模板里配置过滤规则更合理,也不会影响其他采集任务。
正确配置方案
方案1:输入级别用exclude_lines过滤(推荐)
直接在autodiscover的容器采集配置里加exclude_lines规则,采集阶段直接丢弃匹配日志,性能最优:
filebeat.autodiscover: providers: - type: kubernetes node: ${NODE_NAME} hints.enabled: true templates: - condition: equals: kubernetes.namespace: default config: - type: container paths: - /var/log/containers/*${data.kubernetes.container.id}.log # 匹配所有包含GET子串的日志直接丢弃,支持传入多个关键词 exclude_lines: ['GET'] processors: # 其他全局处理规则保持不变 output.logstash: hosts: ['logstash:5044']
方案2:全局processors用contains匹配
如果需要所有采集的日志都生效这个过滤规则,用contains条件实现子串匹配,比正则写法更简洁不易出错:
processors: - drop_event: when: contains: message: 'GET'
方案3:坚持用regexp的正确写法
如果一定要用正则实现,需要加.*匹配关键词前后的任意字符:
processors: - drop_event: when.regexp: message: '.*GET.*'
配置不生效排查思路
如果修改后还是不生效,可以按以下步骤排查:
- 临时把output改成控制台输出测试:
output.console: {pretty: true},确认过滤规则本身是否生效,排除logstash侧的链路问题 - 检查采集到的日志字段名,部分做过JSON解析的容器日志会把内容存在
json.message等自定义字段,需要对应调整匹配的字段名 - 确认Kubernetes集群内的Pod没有配置
co.elastic.logs/exclude_lines等Filebeat注解,hints模式下注解优先级高于模板配置,会覆盖你的规则
内容的提问来源于stack exchange,提问作者Dhody Rahmad Hidayat
相关产品推荐
相关产品推荐

