LogQL基本语法
LogQL是Grafana Loki专用的日志查询语言,其设计灵感来自PromQL(Prometheus查询语言)。它允许用户通过类似SQL的语法从Loki中提取和转换日志数据。本文将介绍LogQL的核心语法结构,帮助初学者快速上手。
基础概念
LogQL查询由两部分组成:
- 日志流选择器(Log Stream Selector):用于筛选特定的日志流
- 日志管道(Log Pipeline):对选定的日志流进行过滤和处理
基本语法结构:
logql
{日志流选择器} | 日志管道
日志流选择器
日志流选择器使用键值对形式从Loki中筛选日志,语法与Prometheus标签选择器类似:
logql
{app="frontend", env="production"}
这将返回所有app
标签为frontend
且env
标签为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
此查询:
- 选择生产环境的api-server日志
- 筛选包含"panic"的日志行
- 解析JSON格式
- 过滤状态码为500的日志
- 进一步筛选响应时间超过1秒的请求
案例2:分析Nginx访问日志
logql
{job="nginx/access"}
| logfmt
| remote_addr =~ "192.168.*"
| status_code >= 400
| rate() by (path)
此查询:
- 选择Nginx访问日志
- 解析logfmt格式
- 筛选来自192.168子网的请求
- 找出所有4xx和5xx错误
- 按路径计算错误率
总结
LogQL提供了强大的日志查询和分析能力,主要功能包括:
- 通过标签选择器精确筛选日志流
- 使用管道操作符处理和转换日志
- 支持多种日志格式解析
- 能够基于提取的字段进行过滤和聚合
掌握这些基础语法后,你已经可以完成大多数日常日志查询任务。接下来可以学习更高级的LogQL特性,如度量查询和聚合操作。
延伸学习
- 尝试编写查询找出你的应用中所有5xx错误
- 练习使用不同解析器处理你的日志格式
- 组合多个过滤条件创建复杂查询
官方资源