使用Fluentd的exclude指令排除日志失效问题排查
以下是几个排查和解决的方向:
修正正则表达式
你当前用的/^podname-*/存在逻辑问题:*是匹配前面的-零次或多次,这会错误匹配podname(不带横杠)、podname--xxx这类不符合预期的名称。如果要排除以podname-开头的Pod日志,把正则改成:pattern /^podname-.*/或者简化成
/^podname-/,只要开头匹配就会触发排除。确认字段是否存在且名称正确
用forward源接收日志时,得先确认事件里真的有kubernetes.pod_name这个字段。可以临时加一个stdout过滤器,输出原始日志结构:<filter kubernetes.var.log.containers.**> @type stdout </filter>运行后查看Fluentd日志,检查字段名是不是
kubernetes.pod_name——有些场景下字段可能是嵌套的kubernetes.pod.name,这时候要把key改成对应的路径。检查过滤器的匹配Tag是否正确
你的过滤器匹配的是kubernetes.var.log.containers.**,但如果forward源接收的日志Tag不是这个格式,过滤器根本不会生效。可以通过stdout输出的日志查看实际Tag,确保和过滤器的匹配规则一致。调整过滤器的执行顺序
如果你的配置里有kubernetes_metadata这类插件,一定要让它先于grep过滤器执行——只有先把Pod名称等元数据注入到日志事件里,grep才能找到对应的字段进行过滤。正确的顺序示例:<filter kubernetes.var.log.containers.**> @type kubernetes_metadata </filter> <filter kubernetes.var.log.containers.**> @type grep <exclude> key kubernetes.pod_name pattern /^podname-.*/ </exclude> </filter>确认发送端的日志是否携带元数据
如果是通过sidecar或其他Fluentd实例用forward发送日志,要确保发送端已经正确采集了Pod的元数据(比如配置了kubernetes_metadata插件),否则接收端的日志里根本没有kubernetes.pod_name字段,自然无法过滤。
内容的提问来源于stack exchange,提问作者vijay varma

