3. LogQL 入门:查询语法概览与日志流选择器
LogQL 是 Loki 的专用查询语言,受 PromQL 和 SQL 启发,专为日志数据设计。本章将带你掌握 LogQL 的核心语法结构、日志流选择器(Stream Selector)的写法,以及四种标签匹配运算符的精确用法。
3.1 LogQL 查询语法概览
一条完整的 LogQL 查询由两个主要部分组成:日志流选择器 和 日志管道。流选择器用于筛选出目标日志流(即匹配特定标签的日志集合),管道则对筛选后的日志行进行过滤、解析、计算等处理。
基本语法结构:
{标签名="标签值"} | 管道操作符1 | 管道操作符2 ...
其中 {...} 是流选择器,| 之后是管道操作。流选择器是 必须 的,管道操作是可选的。
根据输出类型,LogQL 查询分为两类:
| 查询类型 | 输出内容 | 典型用途 |
|---|---|---|
| 日志行查询 | 原始日志行(含元数据) | 实时查看、故障排查、关键字过滤 |
| 指标查询 | 时间序列指标(聚合结果) | 日志速率、错误率、延迟统计、告警 |
💡 入门要点: 先掌握日志行查询,再学习指标查询。流选择器是两种查询的共同基础。
3.2 日志流选择器(Stream Selector)
日志流选择器使用花括号 {} 包裹,内部由一个或多个 标签匹配表达式 组成,多个表达式之间用逗号 , 分隔,逻辑关系为 AND(即所有条件必须同时满足)。
标签是 Loki 索引日志的关键维度,常见的标签包括 job、namespace、pod、container、app、env 等。选择器的作用是快速缩小搜索范围,避免扫描全量日志。
流选择器示例:
{job="api-server", env="production"}
{namespace="monitoring", app="prometheus"}
{job=~"backend.*", env!="staging"}
3.3 标签匹配运算符
LogQL 提供四种标签匹配运算符,用于定义标签值与目标条件的匹配规则。理解它们的区别是写出高效、精确查询的关键。
| 运算符 | 含义 | 匹配规则 | 示例 |
|---|---|---|---|
= |
完全相等 | 标签值必须与给定字符串完全一致 | {job="api"} |
!= |
不等于 | 标签值不能等于给定字符串 | {job!="api"} |
=~ |
正则匹配 | 标签值匹配给定的正则表达式 | {job=~"api|web"} |
!~ |
正则排除 | 标签值不匹配给定的正则表达式 | {job!~".*test.*"} |
⚠️ 性能警告: 正则运算符
=~ 和 !~ 的计算开销远大于精确匹配 = 和 !=。在流选择器中,尽量使用精确匹配缩小范围,仅在必要时使用正则。避免在正则中使用过于复杂的模式(如回溯量词)。
3.4 流选择器组合示例
通过组合多个标签和运算符,可以构建出精确的日志流筛选条件。以下是一些常见场景的写法:
- 单标签精确匹配:
{app="nginx"}—— 只查询 app 标签为 nginx 的日志流。 - 多标签 AND 组合:
{app="nginx", env="production"}—— 同时满足 app=nginx 且 env=production。 - 排除特定值:
{app="nginx", env!="staging"}—— 查询 nginx 应用,但排除 staging 环境。 - 正则匹配多个值:
{app=~"nginx|apache|tomcat"}—— 匹配 app 为 nginx、apache 或 tomcat 的日志流。 - 正则排除测试环境:
{app="api", env!~".*test.*"}—— 查询 api 应用,排除 env 中包含 "test" 的日志流。
💡 最佳实践: 在流选择器中,将
= 和 != 放在前面,将 =~ 和 !~ 放在后面。Loki 会优先处理精确匹配,提高整体查询性能。
3.5 流选择器工作流程(SVG)
下图展示了 LogQL 查询从输入到输出的完整流程,重点突出流选择器在其中的位置和作用:
3.6 常见错误与避坑指南
- 花括号遗漏: 流选择器必须用
{}包裹,缺少花括号会导致语法错误。 - 标签名拼写错误: 标签名区分大小写,
{App="nginx"}与{app="nginx"}是不同的标签。 - 正则表达式未转义: 在
=~和!~中,特殊字符(如.、*、+)需要正确转义。例如匹配字面量my-app应写为my\-app。 - 过度使用正则: 能用
=或!=解决的问题,不要用正则。正则匹配会显著增加查询延迟。 - 逗号分隔误用: 多个标签条件之间用逗号,不是空格或分号。错误写法:
{app="nginx" env="prod"}。
快速验证技巧: 在 Grafana Explore 的 Loki 数据源中,输入流选择器后,右侧会实时显示匹配的日志流数量。如果数量为 0,请检查标签名和值是否正确,或使用
{__name__=~".+"} 先查看所有可用的标签。