菜单
开源

pack

注意

Promtail 已被弃用,目前处于长期支持 (LTS) 阶段,支持至 2026 年 2 月 28 日。Promtail 将于 2026 年 3 月 2 日终止生命周期 (EOL)。您可以在此处找到迁移资源。

pack 阶段是一个转换阶段,允许您通过将日志行和标签打包到 JSON 对象中,从而将提取的值和标签嵌入到日志行中。

例如,如果您想删除 labels containerpod 但仍保留其值,可以使用此阶段创建以下输出

json
{
  "container": "myapp",
  "pod": "pod-3223f",
  "_entry": "original log message"
}

原始消息将存储在 _entry 键下。

如果您想保留一些 label 或其他 metadata,但它们不适合作为 label(对查询用处不大或基数过高),则此阶段很有用

Loki 的查询功能使您能够轻松访问这些数据,并在查询时对其进行过滤/聚合。

pack 阶段 Schema

yaml
pack:
  # Name from extracted data and/or line labels
  # Labels provided here are automatically removed from the output labels.
  labels:
    - [<string>]

  # If the resulting log line should use any existing timestamp or use time.Now() when the line was processed.
  # To avoid out-of-order issues with Loki, when combining several log streams (separate source files) into one
  # you will want to set a new timestamp on the log line, `ingest_timestamp: true`
  # If you are not combining multiple source files or you know your log lines won't have interlaced timestamps
  # you can set this value to false.
  [ingest_timestamp: <bool> | default = true]

示例

删除 container label 并将其嵌入到日志行中 (Kubernetes pods 可能有多个 container)

yaml
pack:
  labels:
    - container

这将创建一条日志行

json
{
  "container": "myapp",
  "_entry": "original log message"
}

Loki 2.2 还包含一个新的unpack 解析器,用于与 pack 阶段配合使用。

例如

logql
{cluster="us-central1", job="myjob"} | unpack

将自动解包嵌入的 label 和日志行,并自动用原始日志行替换日志行。

更多示例

使用打包的 labels 进行过滤

logql
{cluster="us-central1", job="myjob"} | unpack | container="myapp"

如果您的原始消息是 json 格式,您甚至可以使用 json 解析器两次

logql
{cluster="us-central1", job="myjob"} | unpack | container="myapp" | json | val_from_original_log_json="foo"

或任何其他解析器

logql
{cluster="us-central1", job="myjob"} | unpack | container="myapp" | logfmt | val_from_original_log_json="foo"