如何在Filebeat.inputs中按条件配置多行日志解析?
基于条件判断配置多行日志解析的Filebeat方案
要给集群中特定应用配置指定的多行日志解析规则,你可以通过两种清晰的方式实现,以下是具体配置方案:
方式一:拆分多容器输入(推荐,逻辑更清晰)
针对需要多行解析的应用单独配置一个输入项,通过镜像名或Kubernetes标签精准匹配,其他应用使用默认输入:
filebeatConfig: filebeat.yml: | filebeat.inputs: # 针对需要多行解析的应用配置 - type: container paths: - /var/log/containers/*.log # 匹配目标应用,替换为你实际的镜像标识 include_lines: ['^.*your-multiline-app.*$'] exclude_files: ['^.*kibana.*$'] # 启用指定的多行解析规则 multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}' multiline.negate: true multiline.match: after processors: - add_kubernetes_metadata: host: ${NODE_NAME} matchers: - logs_path: logs_path: "/var/log/containers/" # 其他无需多行解析的应用配置 - type: container paths: - /var/log/containers/*.log processors: - add_kubernetes_metadata: host: ${NODE_NAME} matchers: - logs_path: logs_path: "/var/log/containers/" - drop_event: when: contains: container.image.name: "kibana" output.logstash: hosts: ["logstash-listener:5044"]
方式二:单输入内通过条件处理器启用多行规则
如果不想拆分输入,可以在单个容器输入中,通过if条件判断针对特定应用触发多行解析:
filebeatConfig: filebeat.yml: | filebeat.inputs: - type: container paths: - /var/log/containers/*.log processors: - add_kubernetes_metadata: host: ${NODE_NAME} matchers: - logs_path: logs_path: "/var/log/containers/" # 针对目标应用启用多行解析 - if: contains: container.image.name: "your-multiline-app" then: # 先解析容器日志的JSON格式(必填,因为容器日志默认是JSON结构) - decode_json_fields: fields: ["message"] target: "" # 应用指定的多行规则 - multiline: pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}' negate: true match: after - drop_event: when: contains: container.image.name: "kibana" output.logstash: hosts: ["logstash-listener:5044"]
关键注意点
- 替换
your-multiline-app为你实际需要多行解析的应用镜像名,也可以用kubernetes.labels.app这类标签做更精准的匹配 - 容器日志默认是JSON格式,方式二中必须先通过
decode_json_fields解析message字段,才能对日志内容应用多行规则 - 方式一的优势是规则分离,不同应用的日志处理逻辑互不干扰,后续排查问题更便捷
内容的提问来源于stack exchange,提问作者Linux Dev
相关产品推荐
相关产品推荐

