Loki 查询语言(LogQL)简介
LogQL是Grafana Loki专用的查询语言,灵感来自PromQL(Prometheus查询语言),专为日志数据的查询和分析而设计。它允许你像查询指标一样高效地查询日志。
基础查询结构
LogQL查询由两部分组成:
- 日志流选择器:确定要查询哪些日志流
- 日志管道(可选):对选定的日志进行过滤和处理
基本语法格式:
logql
{流选择器} | 日志管道
1. 日志流选择器
流选择器使用键值对来过滤日志流,语法与Prometheus标签选择器相同:
logql
{app="nginx", env="production"}
这个查询会选择所有具有标签app="nginx"
和env="production"
的日志流。
标签匹配操作符
=
:精确匹配!=
:不等于=~
:正则匹配!~
:正则不匹配
2. 日志管道
日志管道由一系列表达式组成,用于过滤和转换日志内容:
logql
{app="nginx"} |= "error" | json | latency > 500ms
这个管道会:
- 选择所有nginx应用的日志
- 过滤出包含"error"的日志行
- 解析JSON格式的日志
- 筛选latency字段大于500ms的日志
常用过滤运算符
运算符 | 描述 | 示例 |
---|---|---|
` | =` | 包含字符串 |
!= | 不包含字符串 | != "debug" |
` | ~` | 匹配正则表达式 |
!~ | 不匹配正则表达式 | !~ "password" |
实际案例
案例1:查找特定错误
logql
{namespace="default", pod=~"frontend-.*"}
|= "panic"
| json
| level="error"
这个查询会:
- 选择default命名空间下所有以frontend-开头的pod
- 筛选包含"panic"的日志行
- 解析JSON格式
- 找出level字段为error的日志
案例2:分析HTTP访问日志
logql
{job="nginx-access"}
| logfmt
| status_code >= 400
| rate() by (status_code)
这个查询会:
- 选择nginx访问日志
- 解析logfmt格式
- 找出状态码≥400的错误
- 按状态码分组计算错误率
日志解析器
LogQL支持多种日志格式解析器:
-
JSON解析器:
logql{app="api"} | json
-
Logfmt解析器:
logql{app="api"} | logfmt
-
正则表达式解析器:
logql{app="nginx"} | regexp "(?P<ip>\\S+) (?P<method>\\S+) (?P<path>\\S+)"
指标查询
LogQL还可以将日志转换为指标:
logql
# 计算每秒错误数
rate({app="api"} |= "error" [5m])
# 按状态码分组的请求率
sum by (status_code) (
rate({app="api"} | logfmt | __error__="" [5m])
)
总结
LogQL是Loki强大功能的核心,通过本介绍你已了解:
- 基本查询结构(流选择器+日志管道)
- 常用过滤和解析方法
- 实际应用场景
- 如何将日志转换为指标
练习建议
- 尝试查询你环境中某个应用的错误日志
- 练习使用不同解析器解析结构化日志
- 创建简单的日志指标查询
后续学习
掌握基础后,可以继续学习:
- LogQL高级查询技巧
- Loki聚合操作
- 查询性能优化