LogQL 行过滤是什么
行过滤是 LogQL 在流选择器之后追加的正文条件:先用大括号里的标签把流范围收敛,再用 |= 包含、!= 不包含、|~ 正则匹配、!~ 正则排除逐层筛掉不需要的行。过滤按书写顺序依次执行,前一个条件的结果就是后一个条件的输入,所以条件的先后顺序既影响可读性也影响扫描量。
基本信息
| 适用平台 | Grafana Loki 的 LogQL 查询语言 |
|---|---|
| 前置条件 | 必须先用 {标签=值} 选定流,不能只写正文条件 |
| 运算符 | |= 包含、!= 不包含、|~ 正则匹配、!~ 正则排除 |
| 正则引擎 | RE2 语法,不支持反向引用等 PCRE 特性 |
典型使用场景
- 按关键字收敛排障范围:先选服务流,再筛出含 error 的行
- 排除已知噪声:!= "healthcheck" 去掉健康检查刷屏
- 多条错误码一次命中:|~ "code=(500|502|503)" 合并三类故障
- 多步收敛定位:包含 + 排除 + 正则组合,把范围压到几十行
- 与解析组合:行过滤后再用 json 或 logfmt 提取字段做统计
过滤链示例
过滤链示例
{app="api", env="prod"} |= "error" # 先按标签选流,再包含关键字
!= "timeout" # 排除已知可忽略的错误
|~ "code=(500|502|503)" # 正则命中指定状态码
# 组合解读:包含 error、不含 timeout、且匹配状态码正则
# 反斜杠在正则中要转义,如路径匹配 |~ "/v1/orders/[0-9]+"
# 大小写敏感,必要时用 (?i) 前缀放宽,例如 |~ "(?i)error"运算符速查
| 运算符 | 含义 | 示例与注意 |
|---|---|---|
| |= | 正文包含子串 | |= "connection refused",普通字符串不做正则解析 |
| != | 正文不包含子串 | != "health",用于去噪 |
| |~ | 正则匹配(RE2) | |~ "code=5..",语法错误会让查询直接失败 |
| !~ | 正则不匹配 | !~ "debug|trace",逻辑取反时先验证样本 |
| (无) | 多个过滤按序串联 | 高选择性条件放前面可减少后续处理量 |
行过滤针对日志正文整行,不区分字段语义;要按字段过滤应先解析(json、logfmt、regexp)再用标签或数值条件,否则容易出现看似匹配、实际匹配到别的字段的情况。
RE2 不支持反向引用与部分回溯特性,从其它语言复制来的正则可能不兼容;查询报错时先把正则简化到能跑通,再逐步加条件。