Promtail Pipeline 是什么
Pipeline 是 Promtail 的加工流水线:每读到一行日志,就按 stages 定义的顺序依次处理——先做多行合并,再用正则解析字段,把低基数字段提升为标签,最后从正文里识别时间戳。把解析放在采集端的好处是统一:不同应用按同一套规则输出结构化日志,查询侧只需要按标签筛选与取值,不必每条查询都重写解析表达式。
基本信息
| 适用平台 | Promtail 2.x / 3.x,属于 Loki 生态的采集代理 |
|---|---|
| 配置位置 | scrape_configs 下的 pipeline_stages |
| 执行顺序 | 严格按配置顺序,前一个阶段的输出是后一个的输入 |
| 常用阶段 | multiline、regex、json、labels、timestamp、drop |
典型使用场景
- 多行合并:Java 堆栈先合并成一条事件再解析
- 结构化解析:从文本行提取级别、模块、耗时等字段
- 标签提升:把低基数字段提为标签,让查询能按它筛选
- 时间戳识别:用日志内部时间替代采集时间
- 噪声清理:按条件丢弃健康检查与调试日志,降低存储成本
阶段配置示例
阶段配置示例
pipeline_stages:
- multiline: # 第一步:先合并多行
firstline: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
max_wait_time: 3s
- regex: # 第二步:命名捕获提取字段
expression: '^(?P<ts>[^ ]+) (?P<level>[A-Z]+) (?P<msg>.*)$'
- labels: # 第三步:只提升低基数字段
level:
- timestamp: # 第四步:用日志内部时间
source: ts
format: RFC3339
- drop: # 可选:丢掉健康检查噪声
expression: '.*healthz.*'常用阶段与作用
| 阶段 | 作用 | 使用要点 |
|---|---|---|
| multiline | 合并多行日志 | 要放在解析之前 |
| regex | 命名捕获提取字段 | 正则写错会静默解析失败 |
| labels | 把字段提升为标签 | 只提升低基数字段 |
| timestamp | 识别日志内时间 | 解析失败时回退到采集时间 |
| drop | 按条件丢弃日志 | 用于减少无价值噪声 |
labels 阶段只提升服务、级别这类低基数字段:把耗时、用户标识等高基数值提升为标签会制造海量流,直接导致写入与查询双双恶化。
数值字段留给查询期处理:解析出的耗时可以在查询里用 unwrap 参与统计,不必在采集端就变成标签。