跳到主要内容

Loki 速查表:80+ LogQL 查询、解析器、Promtail 管道与 HTTP API 参考

Grafana Loki 速查表,80+ 条目,覆盖 LogQL 流选择器、行过滤、解析器、指标查询、聚合、Promtail 管道、Loki 配置与 HTTP API。

  • 本地处理
  • 分类 开发运维
  • 适合 格式化、校验、压缩或检查和代码相关的文本。
分类:
83
流选择器 (8)
{app="nginx"}

基础流选择器。选出所有 `app` 标签等于 "nginx" 的日志流。每个 LogQL 表达式都必须以花括号流选择器开头。

示例
{app="nginx"}
{job="varlogs"}
{namespace="production"}
{app="nginx", env="prod"}

多个标签条件取 AND。只有同时满足 `app="nginx"` 和 `env="prod"` 的流才会被选中。流选择器层面没有 OR——需要 OR 时用正则 `=~`。

示例
{app="nginx", env="prod"}
{job="nginx", namespace="prod", pod=~"api-.*"}
{app=~"api|frontend"}

RE2 正则标签匹配。匹配 `app` 等于 "api" 或 "frontend" 的流。正则在两端自动加锚点——`"api"` 只匹配精确字符串,用 `"api.*"` 匹配任意前缀。

常见坑: 正则匹配会扫描所有已知流,不走索引。对 `pod`、`container_id` 等高基数标签优先用精确 `=` 匹配。

示例
{app=~"api|frontend|backend"}
{namespace=~"prod|staging"}
{pod=~"api-[a-z]+-[0-9a-f]+"}
{app!="nginx"}

否定等值匹配。选出 `app` 不等于 "nginx" 的所有流。标签不存在时也会匹配。

示例
{job="prod", env!="dev"}
{namespace!="kube-system"}
{app!~"dev|test"}

否定正则匹配。选出 `app` 不匹配正则的流。适合在只应针对生产环境的查询里排除测试或开发环境。

示例
{env!~"dev|staging|test"}
{namespace!~"kube-.*|istio-.*"}
{__filename__=~"/var/log/nginx.*"}

内部元数据标签以双下划线开头。`__filename__` 由 Promtail 在抓取文件时设置。其他常见内部标签:`__path__`,以及 journald 日志的 `__journal_SYSTEMD_UNIT__`。

示例
{__filename__=~"/var/log/nginx/.*\.log"}
{__journal_SYSTEMD_UNIT__="nginx.service"}
{app=~".+"}

匹配所有设置了 `app` 标签(任意非空值)的流。想在指标查询里表达"所有服务"时,用这个比裸 `{}` 安全,避免无意的基数爆炸。

常见坑: 指标查询里空选择器 `{}` 会命中 Loki 里的每个流。生产查询里始终至少加一个标签过滤器。

示例
sum(rate({app=~".+"} [5m])) by (app)
{namespace=~".+", env="prod"}
{app="api"} offset 1h

时间偏移修饰符。把查询窗口往过去移动。适合把当前指标和一小时前的同一窗口做比较:`rate({app="api"} [5m]) / rate({app="api"} [5m] offset 1h)`。

示例
rate({app="api"} [5m] offset 1h)
rate({app="api"} |= "error" [5m]) / rate({app="api"} |= "error" [5m] offset 1d)
行过滤器 (7)
|= "error"

行包含过滤器。只保留包含字面字符串 "error" 的行。区分大小写。在任何解析之前执行——减少日志量最快的方式。

常见坑: `|=` 区分大小写。"Error" 和 "error" 是不同的。用 `|~ "(?i)error"` 做大小写不敏感匹配。

示例
{app="nginx"} |= "error"
{app="api"} |= "ERROR" |= "timeout"
!= "debug"

行不包含过滤器。丢弃包含字面字符串的行。适合在解析前过滤掉冗长日志级别,避免对丢弃的行付出解析代价。

示例
{app="api"} != "debug" != "trace"
{namespace="prod"} != "health check" != "heartbeat" != "ping"
|~ "ERR|error|WARN"

正则行过滤器。保留匹配 RE2 模式的行。用交替(`|`)在一个过滤器里匹配多个关键词。和流选择器不同,行过滤器正则两端不自动加锚点。

示例
{app="nginx"} |~ "5[0-9]{2}"
{app="api"} |~ "(?i)(error|fatal|panic)"
{app="worker"} |~ "^[0-9]{4}-[0-9]{2}-[0-9]{2}.*ERROR"
!~ "debug|trace"

正则非匹配行过滤器。丢弃匹配 RE2 模式的行。链式多个过滤器逐步缩小结果——每个阶段进一步减少行数。

示例
{app="api"} |= "request" !~ "health|ping|metrics"
{job="nginx"} !~ "2[0-9]{2}" |= "GET"
|= "error" |= "timeout"

链式行过滤器取 AND。一行必须通过所有过滤器才能继续流转管道。过滤器从左到右执行,早期退出在到达代价高的阶段之前就廉价地丢弃行。

示例
{app="api"} |= "error" |= "connection" != "debug"
{app="db"} |~ "deadlock|timeout" != "warning"
|> "<_> level=<level> msg=<msg> <_>"

模式行过滤器(Loki 3.x+)。有名占位符 `<field>` 匹配任意非空白值;`<_>` 匹配任意内容。对结构化日志行比正则快。不提取标签——提取标签需在后面加解析器阶段。

示例
{app="api"} |> "<_> method=<method> path=<path> status=<status> <_>"
|= `"error": true`

反引号定界字符串无需反斜杠转义。当过滤字面量包含双引号、反斜杠或其他在普通引号字符串里需要转义的字符时,用反引号包裹。

示例
{app="api"} |= `"error": true`
{app="nginx"} |= `GET "/api/v1/users"` |= `"status": 500`
解析器 (10)
| json

JSON 解析器。提取所有顶级 JSON 键为标签。嵌套对象被展平:`{"req":{"method":"GET"}}` 生成 `req_method="GET"`。格式错误的行会被标注 `__error__="JSONParserErr"`。

常见坑: 不要对非 JSON 日志用 `| json`,每行都会变成解析错误,`__error__` 标签会撑大基数。始终在后面加 `| __error__ = ""` 排除解析失败的行。

示例
{app="api"} | json
{app="api"} |= "error" | json | __error__ = "" | level = "error"
| json field="nested.key"

JSON 解析器指定字段路径。用点路径访问嵌套键。标签名默认为路径最后一段。用 `alias=path` 重命名:`| json status="response.code"`。

示例
{app="api"} | json status="response.status", user="auth.userId"
{app="api"} | json msg="message" | msg = "request completed"
| logfmt

Logfmt 解析器。解析空格分隔的 `key=value` 或 `key="value with spaces"` 对——Go `log/logfmt` 格式。在 Go 应用和 Kubernetes 系统组件里广泛使用。

示例
{app="api"} | logfmt | level = "error"
{job="kube-apiserver"} | logfmt | component = "etcd" | err != ""
| pattern "<ip> - - [<_>] \"<method> <path> <_>\" <status> <bytes>"

模式解析器。有名占位符把匹配的值捕获为标签;`<_>` 丢弃匹配的内容。对 nginx/Apache 等固定列格式比正则快,也更易读。

示例
{job="nginx"} | pattern "<ip> - - [<_>] \"<method> <path> <_>\" <status> <size>"
{job="nginx"} | pattern "<ip> - - [<_>] \"<method> <path> <_>\" <status> <size>" | status = "500"
| regexp "(?P<method>\\w+) (?P<path>[^ ]+) HTTP"

带 RE2 命名捕获组的正则解析器。每个 `(?P<name>...)` 组成为一个标签。无名组被丢弃。最慢的解析器选项——尽可能优先用 `| json`、`| logfmt` 或 `| pattern`。

常见坑: `| regexp` 比结构化解析器慢 5~10 倍。只有日志格式太不规则、无法用其他解析器时才用它。

示例
{job="app"} | regexp `(?P<level>\w+)\s+(?P<component>\[\w+\])\s+(?P<msg>.*)`
| unpack

Unpack 解析器。读取 Promtail `pack` 管道阶段打包的日志条目——一个把原始日志行编码在 `_entry` 字段的 JSON 封装,加上额外标签。还原原始行以供进一步处理。

示例
{job="packed-logs"} | unpack
{job="packed-logs"} | unpack | level = "error"
| line_format "{{.level}} {{.msg}}"

用 Go 模板重写整个日志行。用 `.label_name` 引用提取的标签。可用模板函数:`ToUpper`、`ToLower`、`Replace`、`trim`、`upper`、`lower`。适合在显示前规范化混合日志格式。

示例
{app="api"} | json | line_format "{{.level | upper}} {{.ts}} {{.msg}}"
{app="api"} | logfmt | line_format "[{{.level}}] {{.component}}: {{.msg}}"
| label_format level=log_level

重命名管道中的标签。右边是来源标签,左边是新名称。删除标签把它设为空字符串:`| label_format unwanted=""`。重命名时来源标签会被保留。

示例
{app="api"} | json | label_format status_code=status
{app="api"} | logfmt | label_format level=lvl, message=msg
| decolorize

在进一步处理前去除日志行里的 ANSI 颜色/SGR 转义码。当应用向日志文件输出带颜色的终端输出时,在 `| json` 或 `| pattern` 前使用,否则解析器会报错。

示例
{app="colorful-app"} | decolorize | json
{app="cli-tool"} | decolorize | pattern "<level> <msg>"
| drop status, env

从管道中删除标签以降低基数。删除后的标签无法再过滤。用来移除不需要计算指标的高基数解析器输出(如原始请求体)。

示例
{app="api"} | json | drop _entry, tenant_id
{job="nginx"} | pattern "..." | drop __filename__
标签过滤器 (7)
| status = "200"

标签等值过滤器(解析后)。过滤提取标签 `status` 等于字符串 "200" 的行。如果标签在该行不存在,该行被丢弃。

示例
{app="nginx"} | logfmt | level = "error"
{app="api"} | json | env = "prod" | service = "payments"
| status != "200"

标签不等过滤器。保留标签存在且不等于该值的行。标签不存在的行也会被丢弃——用 `| status != ""` 来保留标签不存在的行。

示例
{app="nginx"} | json | status != "200"
{app="api"} | logfmt | level != "info" | level != "debug"
| status =~ "5.."

标签正则过滤器。保留标签值匹配 RE2 正则的行。正则在两端自动加锚点——`"5.."` 精确匹配以 5 开头的三个字符。

示例
{app="nginx"} | json | method =~ "POST|PUT|PATCH"
{app="api"} | logfmt | level =~ "error|fatal|panic"
| duration > 1s

带时间单位的数字标签过滤器。Loki 解析 Go 风格时长字符串(1s、500ms、2.5m、1h)并做数值比较。支持单位:ns、us(µs)、ms、s、m、h。

示例
{app="api"} | json | duration > 500ms
{app="db"} | logfmt | query_time >= 2s | query_time < 30s
| bytes > 1mb

带字节单位的数字标签过滤器。识别的单位:b、kib、kb、mib、mb、gib、gb、tib、tb。比较运算符:`>`、`>=`、`<`、`<=`、`=`、`!=`。

示例
{app="storage"} | json | response_bytes > 1mb
{job="nginx"} | pattern "... <status> <bytes>" | bytes > 1024
| __error__ = ""

过滤掉解析错误。当行解析失败时,Loki 把 `__error__` 设为错误类型(如 "JSONParserErr"、"LogfmtParserErr")。`| __error__ = ""` 只保留解析成功的行,对准确的指标计算至关重要。

常见坑: 不加这个过滤器,对解析后标签的指标查询会悄悄把错误行算进去。错误行没有提取到标签,会绕过标签过滤器——导致计数偏低。

示例
{app="api"} | json | __error__ = "" | level = "error"
{job="nginx"} | logfmt | __error__ = "" | status > 499
| level = "error" | status > 400

链式标签过滤器取 AND。所有条件都必须为真。顺序不影响正确性,但把代价低或选择性强的过滤器放前面可提升性能。

示例
{app="api"} | json | level = "error" | duration > 1s | service = "payments"
指标查询 (8)
rate({app="nginx"} [5m])

过去 5 分钟每秒日志行速率。Loki 里最常用的指标查询。把它作为"这个服务有多忙?"的基准线和 SLO 消耗率告警的基础。

示例
rate({app="nginx"} [5m])
sum(rate({namespace="prod"} [5m])) by (app)
count_over_time({app="nginx"} [5m])

5 分钟范围内日志行的总计数。返回原始计数(不是每秒)。适合计算总量,但拉宽时间范围时值会突然变大——趋势图用 `rate()`。

常见坑: 在 Grafana 仪表板里用 `count_over_time` 配合时间范围选择器会导致值跳变。仪表板用 `rate()`。

示例
count_over_time({app="nginx"} |= "error" [1h])
sum(count_over_time({namespace="prod"} [1d])) by (app)
bytes_over_time({app="nginx"} [5m])

范围内摄入的压缩日志数据字节总量。适合摄入成本分析和容量规划。

示例
sum(bytes_over_time({namespace="prod"} [1h])) by (app)
bytes_rate({app="nginx"} [5m])

范围窗口内平均的每秒摄入字节数。`rate()` 的字节版本。用于监控摄入吞吐量和检测日志风暴。

示例
sum(bytes_rate({namespace="prod"} [5m])) by (app)
topk(5, sum(bytes_rate({} [5m])) by (job))
rate({app} |= "error" [5m])

错误日志速率。组合流选择器、行过滤器和指标函数。完整日志管道在指标计算前运行。是错误率 SLO 告警的基础。

示例
sum(rate({app=~"api|frontend"} |= "error" [5m])) by (app)
rate({app="nginx"} | json | status =~ "5.." [5m])
rate({app} | json | status > 499 [5m])

带解析器和标签过滤器的指标查询。从 JSON 日志提取 `status`,然后只计算每秒 HTTP 5xx 行。最佳实践:在标签过滤器前加 `| __error__ = ""`。

示例
sum(rate({app="api"} | json | __error__ = "" | status > 499 [5m])) by (path)
rate({job="nginx"} | pattern "<_> <status> <_>" | status =~ "5.." [5m])
topk(5, sum(rate({app} [5m])) by (pod))

按日志速率取前 5 个 Pod。聚合算子(`sum`、`topk`、`avg` 等)包裹指标表达式。求值顺序:日志管道 → 指标函数 → 聚合算子。

示例
topk(10, sum(rate({namespace="prod"} [5m])) by (app))
bottomk(3, sum(bytes_rate({} [5m])) by (namespace))
increase({app} |= "error" [1h])

`count_over_time` 的别名。返回范围内日志数量的总增量。当你想知道"过去一小时发生了多少错误"时,比 `count_over_time` 语义更清晰。

示例
increase({app="worker"} |= "job failed" [24h])
sum(increase({namespace="prod"} |= "panic" [1h])) by (app)
聚合算子 (7)
sum(rate({app} [5m])) by (namespace)

按 `namespace` 分组对指标值求和。`by (label, ...)` 子句指定哪些标签在聚合后保留——其他标签从结果中被删除。所有匹配流的指标被求和。

示例
sum(rate({} [5m])) by (app, namespace)
sum(bytes_rate({namespace="prod"} [5m])) by (app)
avg(rate({app} [5m])) by (env)

对共享相同 `env` 标签的流的指标值取平均。当各实例流量不同时用于归一化速率。

示例
avg(rate({namespace="prod"} [5m])) by (app)
max(rate({app} [5m])) by (host)

跨流的指标最大值,按 `host` 分组。适合找集群中最忙的 Pod 或节点。

示例
max(rate({namespace="prod"} [5m])) by (pod)
topk(10, sum(rate({app} [5m])) by (app))

按聚合值返回前 k 个标签集。常用于按日志速率、错误率或日志量对服务排名。

示例
topk(5, sum(rate({namespace="prod"} |= "error" [5m])) by (app))
bottomk(3, sum(rate({app} [5m])) by (host))

按值返回后 k 个标签集。`topk` 的反向操作。适合找利用率低或静默失败的服务。

示例
bottomk(5, sum(bytes_rate({namespace="prod"} [5m])) by (app))
sum without (pod) (rate({app} [5m]))

`without (labels)` 对列出标签之外的所有标签聚合——`by` 的补集。当你知道要丢弃哪些维度而不是保留哪些时用它。

示例
sum without (pod, instance) (rate({namespace="prod"} [5m]))
count(rate({app} [5m])) by (app)

计算对结果有贡献的不同标签集(流)的数量,按 `app` 分组。适合追踪有多少活跃 Pod 或实例在输出日志。

示例
count(rate({namespace="prod"} [5m])) by (app)
函数 (10)
| unwrap field

从标签 `field` 提取数字值作为 over-time 聚合函数的样本值。在 `avg_over_time`、`quantile_over_time` 等函数前必须使用。标签值必须是裸数字。

常见坑: 对时长字符串(如 "200ms")用 `| unwrap duration(field)`。对字节字符串(如 "1.5MiB")用 `| unwrap bytes(field)`。普通 `unwrap` 只解析裸数字。

示例
{app="api"} | json | unwrap response_ms
{app="api"} | logfmt | unwrap duration(request_time)
{app="storage"} | json | unwrap bytes(response_size)
quantile_over_time(0.95, {app} | json | unwrap duration_ms [5m]) by (path)

每个接口的 P95 延迟。Loki 里等价于 Prometheus `histogram_quantile` 的用法。组合:流选择器 → 解析器 → `| unwrap` → `quantile_over_time` → 可选的 `by` 聚合。

示例
quantile_over_time(0.50, {app="api"} | json | unwrap duration_ms [5m]) by (path)
quantile_over_time(0.99, {app="api"} | logfmt | unwrap duration(resp_time) [5m]) by (endpoint)
avg_over_time({app} | json | unwrap response_ms [5m])

时间范围内 unwrap 数字值的平均值。用于平均延迟、平均队列深度或从日志行提取的其他算术均值。

示例
avg_over_time({app="api"} | logfmt | unwrap duration(resp_time) [5m]) by (service)
max_over_time({app} | json | unwrap bytes [5m])

时间范围内 unwrap 值的最大值。适合从日志数据获取响应大小峰值、最大延迟尖峰或最坏情况的内存用量。

示例
max_over_time({app="api"} | json | unwrap duration_ms [5m]) by (path)
min_over_time({app} | json | unwrap bytes [5m])

时间范围内 unwrap 值的最小值。和 `max_over_time` 配合可从日志数据计算观测到的值的范围(离散度)。

示例
min_over_time({app="cache"} | json | unwrap hit_rate [5m])
sum_over_time({app} | json | unwrap bytes_transferred [5m])

时间范围内所有 unwrap 值的总和。适合计算传输字节总量、事件计数总量或嵌入在日志行里的任何累积指标。

示例
sum_over_time({app="gateway"} | logfmt | unwrap bytes(transferred) [1h])
first_over_time / last_over_time

`first_over_time` 返回范围内最旧的样本;`last_over_time` 返回最新的。适合从日志数据获取"这个窗口开始/结束时的状态码是什么?"。

示例
first_over_time({app="api"} | json | unwrap status [5m]) by (host)
last_over_time({app="api"} | json | unwrap queue_size [1m])
absent_over_time({app="cron"} [10m])

如果整个范围内都没有从匹配流收到日志行,返回值为 1 的向量。有日志时返回空。对静默 cron 任务或宕机服务告警的标准模式。

常见坑: 流选择器里必须至少有一个标签匹配器,否则 Loki 无法从结果中判断哪个流"缺席"。

示例
absent_over_time({app="backup-job", env="prod"} [30m])
absent_over_time({job="heartbeat", host="server-01"} [5m])
vector(0)

把常量标量作为单元素向量返回。在算术运算中很有用:`rate({app} [5m]) / vector(100)` 计算百分比,或 `sum(rate) or vector(0)` 在流缺席时确保有零基准。

示例
sum(rate({app="api"} |= "error" [5m])) / sum(rate({app="api"} [5m])) * vector(100)
label_replace(rate({app} [5m]), "short_host", "$1", "host", "(.*)\\..*")

聚合后的标签操作。`label_replace(expr, dst, replacement, src, regex)` 对 `src` 标签应用正则,将结果写入 `dst`。适合把长主机名规范化为短名称。

示例
label_replace(sum(rate({app} [5m])) by (host), "short", "$1", "host", "([^.]+).*")
Promtail (8)
pipeline_stages: (overview)

Promtail 管道阶段在发送到 Loki 前处理每条日志行。阶段按顺序运行:`regex`/`json` 提取字段,`labels` 把字段提升为 Loki 流标签,`timestamp` 覆盖时间,`output` 重写日志行。

示例
pipeline_stages:
  - regex:
      expression: '(?P<level>INFO|WARN|ERROR|DEBUG)'
  - labels:
      level:
  - timestamp:
      source: time
      format: RFC3339
regex stage

用 Go RE2 正则从日志行提取命名组。捕获的值存入提取映射,供后续阶段使用。`source` 默认为原始日志行。

示例
- regex:
    expression: '^(?P<ip>\S+) \S+ \S+ \[(?P<ts>[^\]]+)\] "(?P<method>\w+) (?P<path>\S+)[^"]*" (?P<status>\d{3}) (?P<bytes>\d+)'
- regex:
    source: message
    expression: 'error: (?P<error_code>[A-Z0-9_]+)'
json stage

把日志行(或 `source` 标签)解析为 JSON,将指定键提取到提取映射中。用 `expressions` 在提取时重命名。

示例
- json:
    expressions:
      level: level
      msg: message
      ts: timestamp
- json:
    source: attributes
    expressions:
      user_id: userId
labels stage

把提取映射中的值提升为 Loki 流标签。标签会增加索引基数——只提升低基数的值(如 `level`、`app`、`env`)、在 LogQL 里会过滤的字段。

常见坑: 绝不要把高基数值(用户 ID、请求 ID、IP 地址)提升为标签——这会撑大索引并导致 ingester 内存溢出。

示例
- labels:
    level:
    app:
    env:
- labels:
    level:      # source key from extracted map
    component:  # same name, same key
timestamp stage

用提取字段覆盖日志条目的时间戳。支持 Go `time.Parse` 布局、`Unix`、`UnixMs`、`UnixUs`、`UnixNs` 以及常用名称(`RFC3339`、`RFC3339Nano`)。

示例
- timestamp:
    source: ts
    format: RFC3339
- timestamp:
    source: log_time
    format: "2006-01-02T15:04:05.000Z07:00"
    fallback_formats: ["2006-01-02 15:04:05"]
multiline stage

把多行日志条目(如 Java 堆栈跟踪)合并为单个 Loki 日志行。`firstline` 是匹配新条目开始的正则;后续行被追加,直到下一次匹配。

示例
- multiline:
    firstline: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
    max_wait_time: 3s
    max_lines: 128
output stage

把发送到 Loki 的日志行设为提取映射中某个键的值。用于在解析 JSON 之后,把结构化字段而不是原始行作为日志体发送。

示例
- json:
    expressions:
      msg: message
- output:
    source: msg
pack stage

把日志行和提取映射中的标签打包成 JSON 封装:`{"_entry":"原始行","key":"value"}`。用于在 Loki 里做 `| unpack` 前的预处理,以便还原原始行做高级处理。

示例
- pack:
    labels:
      - level
      - component
配置 (9)
auth_enabled: false

关闭多租户。所有请求被视为匿名 `fake` 租户。单租户部署必须设置。多租户模式设为 `true` 并在每个请求上发送 `X-Scope-OrgID` 请求头。

示例
auth_enabled: false
# multi-tenant header:
# X-Scope-OrgID: my-org-id
server: { http_listen_port: 3100 }

Loki 默认监听 3100(HTTP)和 9096(gRPC)端口。gRPC 端口用于分布式/微服务模式下的内部组件通信。

示例
server:
  http_listen_port: 3100
  grpc_listen_port: 9096
  log_level: info
ingester: wal + ring

预写日志(WAL)保护 ingester 崩溃时不丢数据。Loki 2.4 起默认启用。需要一个持久目录。Ring 协调 ingester 实例间的复制。

示例
ingester:
  wal:
    enabled: true
    dir: /loki/wal
  lifecycler:
    ring:
      kvstore:
        store: memberlist
      replication_factor: 3
schema_config

定义各时间段使用的对象存储、块格式和索引类型。多个 schema 周期允许迁移到更新的 schema 而无需重新索引历史数据。

示例
schema_config:
  configs:
    - from: 2020-10-24
      store: boltdb-shipper
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 24h
    - from: 2023-01-01
      store: tsdb
      object_store: s3
      schema: v12
      index:
        prefix: loki_index_
        period: 24h
storage_config

配置块和索引存储后端。常见选择:本地开发/单节点用 `filesystem`,生产用 `s3`/`gcs`/`azure`。`boltdb_shipper` 把本地索引文件上传到对象存储。

示例
storage_config:
  aws:
    s3: s3://us-east-1
    bucketnames: my-loki-chunks
  boltdb_shipper:
    active_index_directory: /loki/index
    cache_location: /loki/cache
    shared_store: s3
limits_config

每租户的摄入和查询限制。默认值保守:`ingestion_rate_mb: 4` 在生产中会触发 429。根据工作负载调整。在这里或通过 ruler API 按租户设置 `retention_period`。

常见坑: 默认 `max_streams_per_user: 10000` 在有很多 Pod 的 Kubernetes 部署中常常被触发。先增加这个值或抑制噪声标签维度。

示例
limits_config:
  ingestion_rate_mb: 16
  ingestion_burst_size_mb: 32
  max_streams_per_user: 100000
  max_query_length: 721h
  retention_period: 30d
ruler: { enable_api: true }

启用 Loki 内置 ruler 来评估 LogQL 告警规则(与 Prometheus 规则格式相同,但 `expr` 使用 LogQL)。配置 `alertmanager_url` 把触发的告警路由到 Alertmanager。

示例
ruler:
  enable_api: true
  enable_alertmanager_v2: true
  alertmanager_url: http://alertmanager:9093
  storage:
    type: local
    local:
      directory: /loki/rules
Loki alerting rule YAML

Loki 告警规则使用标准 Prometheus YAML 格式。`expr` 字段接受 LogQL 指标表达式。`absent_over_time`、`rate` 和 `sum(rate)` 是告警表达式里最常用的。

示例
groups:
  - name: loki-alerts
    rules:
      - alert: HighErrorRate
        expr: |
          sum(rate({app="api"} |= "error" [5m])) by (env)
          / sum(rate({app="api"} [5m])) by (env) > 0.05
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "Error rate > 5% for {{ $labels.env }}"
      - alert: ServiceSilent
        expr: absent_over_time({app="cron"} [30m])
        for: 0m
        labels:
          severity: critical
compactor: { retention_enabled: true }

Compactor 合并 boltdb-shipper 或 tsdb 索引分片、应用保留策略并删除过期块。在集群模式下必须作为单例运行。保留策略在这里执行,不只是在 `limits_config` 里。

示例
compactor:
  working_directory: /loki/compactor
  shared_store: s3
  retention_enabled: true
  retention_delete_delay: 2h
  retention_delete_worker_count: 150
HTTP API (9)
GET /loki/api/v1/query

即时查询。在单个时间点对 LogQL 表达式求值。必填:`query`。可选:`time`(RFC3339 或 Unix 纳秒,默认当前时间)、`limit`(最大行数)、`direction`(forward/backward)。

示例
curl "http://localhost:3100/loki/api/v1/query?query=%7Bapp%3D%22nginx%22%7D&limit=50"
curl -G --data-urlencode 'query={app="nginx"} |= "error"' http://localhost:3100/loki/api/v1/query
GET /loki/api/v1/query_range

时间窗口范围查询。必填:`query`、`start`、`end`(Unix 纳秒或 RFC3339)、`step`(Prometheus 时长或秒数)。返回日志流或指标值的矩阵。

示例
curl "http://localhost:3100/loki/api/v1/query_range?query=%7Bapp%3D%22nginx%22%7D&start=1704067200000000000&end=1704153600000000000&step=60"
GET /loki/api/v1/labels

返回默认时间窗口(最近 6 小时)内所有已知标签名。可选:`start`/`end` 缩小范围,`query`(Loki 2.9+)按流选择器过滤。

示例
curl http://localhost:3100/loki/api/v1/labels
curl -G --data-urlencode 'query={namespace="prod"}' http://localhost:3100/loki/api/v1/labels
GET /loki/api/v1/label/{name}/values

返回某个标签名的所有已知值。构建动态 LogQL 选择器、Grafana 变量下拉框和自动补全的关键 API。可选:`start`/`end`、`query`。

示例
curl http://localhost:3100/loki/api/v1/label/app/values
curl -G --data-urlencode 'query={namespace="prod"}' http://localhost:3100/loki/api/v1/label/app/values
GET /loki/api/v1/series

返回匹配一个或多个选择器的所有活跃标签集(流)。必填:`match[]`。适合审计哪些流在活跃摄入数据,以及列出已知的标签组合。

示例
curl -G --data-urlencode 'match[]={app="nginx"}' http://localhost:3100/loki/api/v1/series
curl -G --data-urlencode 'match[]={namespace="prod"}' http://localhost:3100/loki/api/v1/series
POST /loki/api/v1/push

向 Loki 推送日志条目。Body:包含 `streams` 数组的 JSON。每个流有 `stream`(标签集对象)和 `values`(`["纳秒时间戳字符串", "日志行"]` 对的数组)。时间戳必须是字符串格式的纳秒 Unix 纪元。

示例
curl -X POST http://localhost:3100/loki/api/v1/push \
  -H 'Content-Type: application/json' \
  -d '{
  "streams": [{
    "stream": {"app": "myapp", "env": "prod"},
    "values": [["'$(date +%s%N)'", "log message here"]]
  }]
}'
GET /loki/api/v1/tail (WebSocket)

通过 WebSocket 实时追踪——在摄入时流式传输匹配查询的新日志行。必填:`query`。可选:`limit`(连接时发送的 N 条历史行)、`delay_for`(摄入延迟秒数)。

示例
wscat -c "ws://localhost:3100/loki/api/v1/tail?query=%7Bapp%3D%22nginx%22%7D&limit=20"
GET /loki/api/v1/index/stats

返回流选择器的摄入统计:总流数、块数、条目数和字节数。必填:`query`(流选择器)、`start`、`end`。适合容量规划和成本归因。

示例
curl -G --data-urlencode 'query={namespace="prod"}' "http://localhost:3100/loki/api/v1/index/stats?start=1704067200000000000&end=1704153600000000000"
GET /ready · GET /metrics · GET /config

`/ready` 在所有 Loki 组件就绪时返回 HTTP 200(用作 Kubernetes readiness probe)。`/metrics` 暴露 Loki 自身的 Prometheus 指标。`/config` 显示生效的合并配置(调试时很有用)。

示例
curl http://localhost:3100/ready
curl http://localhost:3100/metrics | grep loki_ingester
curl http://localhost:3100/config | less

这个工具能做什么

可搜索的 Grafana Loki 速查表,80+ 条目按十个分类整理。 流选择器:`{app="nginx"}`,标签匹配器 `=` `!=` `=~` `!~`, 多标签组合条件、内部元数据标签。行过滤器:`|=` `!=` `|~` `!~` 快速预解析过滤,模式过滤器 `|>`,反引号字符串。 解析器:`| json`、`| json field=…`、`| logfmt`、`| pattern`、 `| regexp`、`| unpack`、`| decolorize`、`| line_format`、 `| label_format`、`| drop`。标签过滤器:解析后的等值、正则和 数字比较(支持 duration/bytes 单位)、`__error__` 处理。 指标查询:`rate`、`count_over_time`、`bytes_over_time`、 `bytes_rate`、`increase` 及其聚合变体。聚合:`sum`、`avg`、`max`、 `topk`、`bottomk`、`without`。函数:`unwrap`、`quantile_over_time`、 `avg_over_time`、`absent_over_time`。Promtail:`regex`、`json`、 `labels`、`timestamp`、`multiline`、`output`、`pack` 管道阶段。 Loki 配置:`auth_enabled`、`schema_config`、`storage_config`、 `limits_config`、`ruler`、告警规则、`compactor`。 HTTP API:`/loki/api/v1/query`、`/query_range`、`/labels`、`/push`、`/tail`。 每条都有双语说明、可直接复制的例子和常见坑提醒。全浏览器运行。

工具细节

输入
文本
页面会根据工具类型展示文本框、数值控件、文件选择或结构化输入。
输出
即时结果 + 复制
结果区优先给出可操作结果,支持项会显示复制、下载或可视化预览。
隐私
浏览器本地处理
主工具逻辑未发现外部 API 调用,输入通常留在当前标签页内处理。
保存 / 分享
可分享链接状态
关键设置会进入 URL,复制链接后别人能复现同一组参数。
性能预算
首屏 JS ≤ 48 KB
没有声明 WASM 依赖,适合快速打开和移动端使用。
适用场景
开发运维 · 程序员
分类和职业标签用于推荐相关工具、组织内链,并帮助用户快速判断是否适合当前任务。

怎么用

  1. 1. 输入

    把内容粘贴或拖入工具面板。

  2. 2. 处理

    点击按钮,在浏览器内本地处理,文件不上传。

  3. 3. 复制 / 下载

    一键复制结果或下载到本地。

Loki 速查表 适合怎么用

适合穿插在写代码、查问题、做 Review、上线前的小任务里。

适合开发场景

  • 格式化、校验、压缩或检查和代码相关的文本。
  • 把片段整理好再放进文档、工单、提交或交接材料。
  • 不切换工具,快速检查一个小 payload。

开发检查项

  • 压缩、混淆这类不可逆处理,先对副本操作。
  • 除非确认工具本地处理,不要粘贴密钥和敏感片段。
  • 转换后的代码上线前,仍要跑自己的测试或 lint。

下一步可以接着做

这些入口会把当前任务接到更完整的工具链里。

  1. 1 Prometheus 速查表 Prometheus 速查表,90+ 条目,覆盖 PromQL 选择器、聚合、函数、告警规则、录制规则、HTTP API 与 relabeling。 打开
  2. 2 kubectl 命令速查 kubectl 命令速查,100+ 条 K8s 命令,真实例子和常见坑,含 YAML 片段。 打开
  3. 3 Docker 命令速查 Docker 命令速查,80+ 条命令带真实例子和常见坑,含 Compose 章节。 打开

真实使用场景

  • 事故中快速定位 500 错误突刺

    凌晨两点告警响了。你打开速查表,拿到 `rate({app="api"} | json | status > 499 [5m])`,加上 `by (path)` 找出最吵的接口,再复制 `topk(5, sum(rate(…)) by (path))` 列出前五名。 凌晨两点不用猜语法,不到两分钟搞定。

  • 从结构化日志计算请求延迟分位数

    你的服务输出带 `"duration_ms"` 的 JSON 日志,需要每个接口的 P95 延迟。 打开速查表,复制 `quantile_over_time(0.95, {app="api"} | json | unwrap duration_ms [5m]) by (path)`, 粘贴进 Grafana。速查表还展示了 Go 风格 "200ms" 时长字符串的 `| unwrap duration(field)` 变体,不用反复试错语法。

  • 用 Promtail 解析 nginx 日志

    你需要 Promtail 从 nginx 访问日志提取 `status`、`bytes` 和 `method`。 速查表展示了完整的 `pipeline_stages` 块,包含 `regex` 阶段、把捕获提升为 Loki 标签的 `labels` 阶段,以及忘记在 `labels` 阶段设置 `source: filename` 这个常见坑。复制配置,填上你的 job 名,重载 Promtail 即可。

常见踩坑

  • 用宽泛的流选择器 `{job="varlogs"}` 再加 `|= "error"` 过滤,始终在选择器里加 app/服务标签,避免 Loki 扫描节点上所有日志流。

  • 把标签过滤器放在解析器之前,`{app="api"} | status = "error" | json` 会失败,因为 `status` 在 `| json` 之前不存在。

  • 在仪表板里用 `count_over_time` 看趋势,它返回原始计数,时间范围一变就突变。趋势图用 `rate()`。

  • 解析器后忘了加 `| __error__ = ""`,解析错误会悄悄撑大指标,因为错误行没有提取到标签,会悄悄通过后续标签过滤器。

  • 用 `| regexp` 来替代 `| pattern` 或 `| json`,`| regexp` 比结构化解析器慢 5~10 倍。

隐私说明

全部在你的浏览器里跑。速查表是内存里的静态数组,搜索框、分类胶囊和复制按钮 都不发任何网络请求。你打的字不会被记录。离网、公司代理后面或离网跳板机上都能用。

常见问题

类似工具组合

做你这行的人, 还会一起用这些。

Made by Toolora · 100% client-side · Updated 2026-07-02