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 查询从输入到输出的完整流程,重点突出流选择器在其中的位置和作用:

LogQL 查询执行流程(流选择器阶段) 用户输入 LogQL 解析流选择器 标签索引匹配 返回匹配日志流 流选择器中的运算符匹配逻辑 = 精确相等 != 不等于 =~ 正则匹配 !~ 正则排除 多个运算符之间用逗号分隔,逻辑关系为 AND(全部满足) 示例:{app="nginx", env!~".*dev.*"} 表示 app 精确等于 nginx,且 env 不包含 "dev"

3.6 常见错误与避坑指南

  • 花括号遗漏: 流选择器必须用 {} 包裹,缺少花括号会导致语法错误。
  • 标签名拼写错误: 标签名区分大小写,{App="nginx"} 与 {app="nginx"} 是不同的标签。
  • 正则表达式未转义: 在 =~ 和 !~ 中,特殊字符(如 .、*、+)需要正确转义。例如匹配字面量 my-app 应写为 my\-app。
  • 过度使用正则: 能用 = 或 != 解决的问题,不要用正则。正则匹配会显著增加查询延迟。
  • 逗号分隔误用: 多个标签条件之间用逗号,不是空格或分号。错误写法:{app="nginx" env="prod"}。
快速验证技巧: 在 Grafana Explore 的 Loki 数据源中,输入流选择器后,右侧会实时显示匹配的日志流数量。如果数量为 0,请检查标签名和值是否正确,或使用 {__name__=~".+"} 先查看所有可用的标签。