日志查询
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/