跳到主要内容

LogQL基本语法

LogQL是Grafana Loki专用的日志查询语言,其设计灵感来自PromQL(Prometheus查询语言)。它允许用户通过类似SQL的语法从Loki中提取和转换日志数据。本文将介绍LogQL的核心语法结构,帮助初学者快速上手。

基础概念

LogQL查询由两部分组成:

  1. 日志流选择器(Log Stream Selector):用于筛选特定的日志流
  2. 日志管道(Log Pipeline):对选定的日志流进行过滤和处理

基本语法结构:

logql
{日志流选择器} | 日志管道

日志流选择器

日志流选择器使用键值对形式从Loki中筛选日志,语法与Prometheus标签选择器类似:

logql
{app="frontend", env="production"}

这将返回所有app标签为frontendenv标签为production的日志。

标签匹配操作符
  • =:精确匹配
  • !=:不等于
  • =~:正则匹配
  • !~:正则不匹配

日志管道

日志管道用于处理和转换选定的日志流,包含多种操作符和函数。

基本过滤

|=:包含字符串匹配

logql
{app="frontend"} |= "error"

!=:不包含字符串匹配

logql
{app="frontend"} != "debug"

|~:正则匹配

logql
{app="frontend"} |~ "error [0-9]+"

!~:正则不匹配

logql
{app="frontend"} !~ "debug [A-Z]+"

日志解析器

LogQL提供多种解析器来提取结构化数据:

JSON解析器

logql
{app="frontend"} | json

提取JSON日志中的所有字段作为标签

Logfmt解析器

logql
{app="backend"} | logfmt

解析logfmt格式的日志

正则解析器

logql
{app="nginx"} | regexp `(?P<ip>\d+\.\d+\.\d+\.\d+)`

使用正则表达式提取命名字段

标签操作

添加/修改标签

logql
{app="frontend"} | label_format new_label="value"

重命名标签

logql
{app="frontend"} | label_format app_old=app

行过滤

在解析后可以基于提取的字段进行过滤:

logql
{app="frontend"} | json | status_code >= 400

实际案例

案例1:查找特定错误

logql
{app="api-server", env="production"} 
|= "panic"
| json
| status_code = 500
| duration >= 1s

此查询:

  1. 选择生产环境的api-server日志
  2. 筛选包含"panic"的日志行
  3. 解析JSON格式
  4. 过滤状态码为500的日志
  5. 进一步筛选响应时间超过1秒的请求

案例2:分析Nginx访问日志

logql
{job="nginx/access"} 
| logfmt
| remote_addr =~ "192.168.*"
| status_code >= 400
| rate() by (path)

此查询:

  1. 选择Nginx访问日志
  2. 解析logfmt格式
  3. 筛选来自192.168子网的请求
  4. 找出所有4xx和5xx错误
  5. 按路径计算错误率

总结

LogQL提供了强大的日志查询和分析能力,主要功能包括:

  • 通过标签选择器精确筛选日志流
  • 使用管道操作符处理和转换日志
  • 支持多种日志格式解析
  • 能够基于提取的字段进行过滤和聚合

掌握这些基础语法后,你已经可以完成大多数日常日志查询任务。接下来可以学习更高级的LogQL特性,如度量查询和聚合操作。

延伸学习

  1. 尝试编写查询找出你的应用中所有5xx错误
  2. 练习使用不同解析器处理你的日志格式
  3. 组合多个过滤条件创建复杂查询