06.5LogQL查询语言

分类: Grafana Loki日志管理

LogQL 查询语言

LogQL 是 Loki 的查询语言,类似于 PromQL。本节将学习:基本查询语法、过滤条件、聚合操作、以及日志解析方法。

基本查询语法

LogQL 查询语法是什么? LogQL 查询语法:

{标签选择器} 操作符 过滤表达式

LogQL 查询示例:

  • {job="app"}
    查询所有 app job 的日志。
  • {job="app", level="error"}
    查询 app job 的 error 级别日志。
  • {job=~"app|api"}
    查询 app 或 api job 的日志。使用正则匹配。
  • {job!="web"}
    查询不是 web job 的日志。

标签选择器有什么操作符呢?

  • = 精确匹配:
    {job="app"}
  • != 不等于:
    {job!="web"}
  • =~ 正则匹配:
    {job=~"app|api"}
  • !~ 正则不匹配:
    {job!~"web.*"}

LogQL 查询流程: LogQL 查询 → 标签选择器(

{job="app"}
)→ 过滤表达式(
|="error"
)→ 返回匹配日志。

掌握这些操作符,可以灵活查询日志。

过滤条件

过滤条件有什么操作符呢?

  • |= 包含(大小写敏感):
    {job="app"} |="error"
    。查找包含 error 的日志。
  • != 不包含:
    {job="app"} !="info"
    。查找不包含 info 的日志。
  • |~ 正则匹配:
    {job="app"} |~"error|ERROR"
    。匹配 error 或 ERROR。
  • !~ 正则不匹配:
    {job="app"} !~"debug|DEBUG"
    。不匹配 debug 或 DEBUG。

可以组合过滤吗? 当然可以。

  • 同时包含多个词:
    {job="app"} |="error" |="database"
    。同时包含 error 和 database。
  • 包含但不包含:
    {job="app"} |="error" !="timeout"
    。包含 error 但不包含 timeout。

过滤条件示例: 标签查询 → 过滤条件(包含/不包含/正则匹配/正则不匹配)→ 返回结果。

过滤条件的注意事项:

  • 大小写敏感:
    |=
    是大小写敏感的。如果需要忽略大小写,使用正则
    |~
  • 性能考虑: 先用标签过滤,再用内容过滤。标签过滤更高效。

合理使用过滤条件,可以快速找到需要的日志。

聚合操作

LogQL 支持哪些聚合操作呢?

  • count_over_time: 统计时间范围内的日志数。例如
    count_over_time({job="app"}[1m])
  • rate: 计算速率。例如
    rate({job="app"}[1m])
  • sum: 求和。例如
    sum(count_over_time({job="app"} |="error" [1m]))
  • avg: 平均值。例如
    avg_over_time(...)
  • max: 最大值。例如
    max_over_time(...)
  • min: 最小值。例如
    min_over_time(...)

聚合示例:

第一个示例:统计每分钟的日志数。

count_over_time({job="app"}[1m])
。这会统计每分钟有多少条日志。

第二个示例:计算每秒的日志速率。

rate({job="app"}[1m])
。这会计算每秒有多少条日志。

第三个示例:按 level 分组统计。

sum(count_over_time({job="app"} |="error" [1m])) by (level)
。这会按 level 分组统计错误日志。

第四个示例:计算平均日志长度。

avg_over_time({job="app"} | json | unwrap length(log) [5m])
。这会计算平均日志长度。

聚合流程: 日志查询 → 时间范围 → 聚合操作 → 分组 → 返回结果。

使用聚合操作,可以分析日志的趋势和模式。

日志解析

LogQL 支持哪些日志解析方法呢?

第一种方法:JSON 解析。

{job="app"} | json
。解析 JSON 格式的日志。

提取字段:

{job="app"} | json | level="error"
。提取 level 字段并过滤。

使用字段值:

{job="app"} | json | unwrap latency [1m]
。使用 latency 字段进行聚合。

第二种方法:正则表达式解析。

{job="app"} | regexp \
(?P<level>\w+)\s+(?P<message>.*)``。使用正则表达式提取字段。

使用提取的字段:

{job="app"} | regexp \
level=(?P<level>\w+)` | level="error"`。使用提取的 level 字段过滤。

第三种方法:模式解析(Pattern)。

{job="app"} | pattern \
<level> <message>``。定义模式提取字段。

提取结构化字段:

{job="app"} | pattern \
<ip> <method> <path> <status>``。从结构化日志中提取字段。

解析流程: 原始日志 → 解析方法(JSON/正则/模式)→ 提取字段 → 过滤/聚合。

日志解析的优势:

  • 结构化查询: 可以基于字段查询。
  • 精确过滤: 可以基于字段值过滤。
  • 聚合分析: 可以基于字段值聚合。

使用日志解析,可以更好地分析日志。

本节小结

在本节中,我们学习了 LogQL 查询语言:

第一个是基本查询语法。 {标签选择器} 操作符 过滤表达式。掌握基本语法很重要。

第二个是过滤条件。 |=(包含)、!=(不包含)、|(正则匹配)、!(正则不匹配)。合理使用过滤条件,可以快速找到需要的日志。

第三个是聚合操作。 count_over_time、rate、sum、avg、max、min。使用聚合操作,可以分析日志的趋势和模式。

第四个是日志解析。 JSON、正则表达式、模式解析。使用日志解析,可以更好地分析日志。

LogQL 功能总结: LogQL 包括基本查询(标签选择器)、过滤条件(内容过滤)、聚合操作(统计分析)、日志解析(结构化查询)。这些功能组合在一起,构成了强大的日志查询能力。

这就是 LogQL 查询语言。掌握 LogQL,可以高效查询和分析日志。

在下一节,我们将学习在 Dashboard 中可视化日志。学习如何创建日志面板。