Promtail配置求助:排除多数Pod的level=info日志仅保留指定Pod全量日志
Promtail配置实现指定Pod保留全量日志、其余丢弃info级别
核心逻辑
- 先给需要保留全量日志的2个Pod打专属标签
- 全局过滤时,仅丢弃未打标签Pod的
level=info日志,打了标签的Pod日志全部保留
具体配置步骤
1. 在Scrape配置中给指定Pod打标签
在Promtail的scrape_configs(针对Kubernetes采集的部分)里,添加relabel_configs,匹配目标Pod名称后添加自定义标签(比如keep_all_logs: "true"):
scrape_configs: - job_name: kubernetes-pods kubernetes_sd_configs: - role: pod relabel_configs: # 匹配需要保留全量日志的两个Pod名称,替换成你的实际Pod名 - source_labels: [__meta_kubernetes_pod_name] regex: 'pod-demo-1|pod-demo-2' # 用|分隔两个Pod名称 action: replace target_label: keep_all_logs replacement: "true" # 保留原有默认relabel规则(比如提取namespace、pod名等) - action: labelmap regex: __meta_kubernetes_pod_label_(.+) - source_labels: [__meta_kubernetes_namespace] action: replace target_label: namespace - source_labels: [__meta_kubernetes_pod_name] action: replace target_label: pod
2. 添加Pipeline Stage过滤日志
根据日志格式选择对应的解析方式,再添加丢弃逻辑:
场景1:JSON结构化日志
如果应用输出的是JSON格式日志(比如{"level":"info", "msg":"xxx"}),先解析出level字段再过滤:
pipeline_stages: # 解析JSON日志,提取level字段 - json: expressions: level: level # 丢弃未打标签Pod的info级别日志 - drop: expression: 'level == "info" && keep_all_logs != "true"' # 保留其他原有处理阶段(比如添加标签、格式化等)
场景2:非结构化文本日志
如果日志是文本格式(比如2024-05-20 10:00:00 level=info msg=xxx),用正则提取level字段:
pipeline_stages: # 正则提取level字段,根据你的日志格式调整正则表达式 - regex: expression: 'level=(?P<level>\w+)' # 过滤逻辑与JSON场景一致 - drop: expression: 'level == "info" && keep_all_logs != "true"'
规则优先级说明
Promtail的执行顺序是固定的:
- 先执行
scrape_configs内的relabel_configs(给指定Pod打标签) - 再按顺序执行
pipeline_stages(先解析日志字段,再判断是否丢弃)
只要保持这个顺序,就能确保指定Pod的全量日志被保留,其余Pod的info日志被过滤。
验证方式
配置生效后,在Loki查询页面:
- 搜索
{pod="pod-demo-1"}能看到该Pod的level=info日志 - 搜索
{pod!="pod-demo-1", pod!="pod-demo-2"}看不到任何level=info日志,说明配置生效
内容的提问来源于stack exchange,提问作者SafiJunaid
相关产品推荐
相关产品推荐

