跳到主要内容

Loki 查询语言(LogQL)简介

LogQL是Grafana Loki专用的查询语言,灵感来自PromQL(Prometheus查询语言),专为日志数据的查询和分析而设计。它允许你像查询指标一样高效地查询日志。

基础查询结构

LogQL查询由两部分组成:

  1. 日志流选择器:确定要查询哪些日志流
  2. 日志管道(可选):对选定的日志进行过滤和处理

基本语法格式:

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

1. 日志流选择器

流选择器使用键值对来过滤日志流,语法与Prometheus标签选择器相同:

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

这个查询会选择所有具有标签app="nginx"env="production"的日志流。

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

2. 日志管道

日志管道由一系列表达式组成,用于过滤和转换日志内容:

logql
{app="nginx"} |= "error" | json | latency > 500ms

这个管道会:

  1. 选择所有nginx应用的日志
  2. 过滤出包含"error"的日志行
  3. 解析JSON格式的日志
  4. 筛选latency字段大于500ms的日志

常用过滤运算符

运算符描述示例
`=`包含字符串
!=不包含字符串!= "debug"
`~`匹配正则表达式
!~不匹配正则表达式!~ "password"

实际案例

案例1:查找特定错误

logql
{namespace="default", pod=~"frontend-.*"} 
|= "panic"
| json
| level="error"

这个查询会:

  1. 选择default命名空间下所有以frontend-开头的pod
  2. 筛选包含"panic"的日志行
  3. 解析JSON格式
  4. 找出level字段为error的日志

案例2:分析HTTP访问日志

logql
{job="nginx-access"} 
| logfmt
| status_code >= 400
| rate() by (status_code)

这个查询会:

  1. 选择nginx访问日志
  2. 解析logfmt格式
  3. 找出状态码≥400的错误
  4. 按状态码分组计算错误率

日志解析器

LogQL支持多种日志格式解析器:

  1. JSON解析器

    logql
    {app="api"} | json
  2. Logfmt解析器

    logql
    {app="api"} | logfmt
  3. 正则表达式解析器

    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强大功能的核心,通过本介绍你已了解:

  • 基本查询结构(流选择器+日志管道)
  • 常用过滤和解析方法
  • 实际应用场景
  • 如何将日志转换为指标
练习建议
  1. 尝试查询你环境中某个应用的错误日志
  2. 练习使用不同解析器解析结构化日志
  3. 创建简单的日志指标查询

后续学习

掌握基础后,可以继续学习:

  • LogQL高级查询技巧
  • Loki聚合操作
  • 查询性能优化