Loki LogQL 查询语句

Loki LogQL

Posted by BlueFat on Tuesday, August 11, 2020

日志查询

Log queries

所有 LogQL 查询都包含一个日志流选择器。

以下示例显示了一个完整的日志查询:

{container="query-frontend",namespace="loki-dev"} |= "metrics.go" | logfmt | duration > 10s and throughput_mb < 500

查询由以下部分组成:

  • 一个日志流选择器,它以命名空间中的容器为{container="query-frontend",namespace="loki-dev"}目标。query-frontendloki-dev

  • 一个日志管道|= "metrics.go" | logfmt | duration > 10s and throughput_mb < 500,它将过滤掉包含单词的日志metrics.go,然后解析每个日志行以提取更多标签并使用它们进行过滤。

  • 为避免转义特殊字符,您可以在引用字符串时使用(反引号)而不是。"例如\w+`与 相同"\w+"。这在编写包含多个需要转义的反斜杠的正则表达式时特别有用。

日志流选择器

Log stream selector

如:

{app="mysql",name="mysql-backup"}

支持以下标签匹配运算符:

  • =: 完全相等
  • !=: 不相等
  • =~: 正则表达式匹配
  • !~: 正则表达式不匹配

正则表达式日志流示例:

  • {name =~ “mysql.+”}

  • {name !~ “mysql.+”}

  • {name !~ `mysql-\d+`}

  • 注意:正则表达式运算符=~ 是完全锚定的,这意味着正则表达式必须匹配整个字符串,包括换行符。默认情况下,正则表达式.字符不匹配换行符。如果您希望正则表达式点字符匹配换行符,您可以使用单行标志,如下所示:(?s)search_term.+matches search_term\n

线过滤器表达式

Line filter expression

行过滤器表达式对grep 来自匹配日志流的聚合日志进行分布。它搜索日志行的内容,丢弃那些与区分大小写的表达式不匹配的行。

每个行过滤器表达式都有一个过滤器运算符 ,后跟文本或正则表达式。支持这些过滤器运算符:

  • |=: 日志行包含字符串
  • !=: 日志行不包含字符串
  • |~:日志行包含与正则表达式的匹配项
  • !~: 日志行不包含与正则表达式的匹配项
{job="mysql"} |= "error"
{name="cassandra"} |~  `error=\w+`
{job="mysql"} |= "error" != "timeout"
{instance=~"kafka-[23]",name="kafka"} != "kafka.server:type=ReplicaManager"

指标查询

当前支持的操作功能为:

  • rate:计算每秒的条目数
  • count_over_time:计算给定范围内每个日志流的条目。

对fluent-bit作业在最近五分钟内的所有日志行进行计数。

count_over_time({job="fluent-bit"}[5m])    

获取fluent-bit作业在过去十秒内所有非超时错误的每秒速率。

rate({job="fluent-bit"} |= "error" != "timeout" [10s]  

集合运算符

  • sum:计算标签上的总和
  • min:选择最少的标签
  • max:选择标签上方的最大值
  • avg:计算标签上的平均值
  • stddev:计算标签上的总体标准差
  • stdvar:计算标签上的总体标准方差
  • count:计算向量中元素的数量
  • bottomk:通过样本值选择最小的k个元素
  • topk:通过样本值选择最大的k个元素 可以通过包含a without或 by子句,使用聚合运算符聚合所有标签值或一组不同的标签值
<aggr-op>([parameter,] <vector expression>) [without|by (<label list>)]

统计最高日志吞吐量按container排序前十的应用程序

topk(10,sum(rate({job="fluent-bit"}[5m])) by(container))

获取最近五分钟内的日志计数,按级别分组

sum(count_over_time({job="fluent-bit"}[5m])) by (level)
{filename="/data/logs/nginx/access.log"}| json | status = 404

参考

https://grafana.com/docs/loki/latest/logql/log_queries/