作为云原生的轻量级日志系统,Loki 是 Grafana 团队参考 Prometheus 的标签思想来做的,只对标签进行索引。这也是日志查询中最重要的一点。
语法组成
基本的查询由 2 部分组成:日志标签 + 过滤
日志标签的查询
日志标签:是一组键值对,在 Promtail 配置文件中进行自定义,如 app: nginx
,或者 1: 2
,只要方便你快速查询日志即可。如下是一个简单的 LogQL
{app="nginx",1="2"}
在上面的例子中表示,查询标签 app
的值为 nginx
的日志,并且在第一个的结果中再查找,第二个对应的键值对。
除了例子中的 =
符号,还支持以下运算符号
- =:完全相等
- !=:不相等
- =~:正则表达式匹配
- !~:正则表达式不匹配
如:匹配标签键为 app,且值为 nginx 的日志
{app = "nginx"}
也可以同时匹配2个,如:匹配标签键为 app,值为 nginx,且 name 不等于 web1 的日志
{app = "nginx",name != "web1"}
如:匹配标签键为 app,值为 nginx,且 name 等于 web1 或者 web2,正则的使用可参考:菜鸟教程-正则表达式
{app = "nginx",name =~ "web[12]"}
如:匹配标签键为app,且值不是以 my 开头的
{app !~ "^mysql.*"}
日志管道
在日志管道中支持6种表达式,这里只说明行过滤表达式,别问为什么,因为复杂不想学,需要用到其他的我再来补充更新,就这样。想要了解其他表达式请参考官方文档:LogQL-log-pipeline
行过滤表达式
在查询到的日志中进行过滤,也可以理解为 Linux 命令的 grep。
同样过滤也有4个运算符号
- |=:显示过滤字符串
- !=:不显示过滤字符串
- |~:日志行匹配正则表达式
- !~:日志行与正则表达式不匹配
如:查询日志中含有 error 的行
{app="nginx"} |= "error"
如:查询日志中不含有 warn 的行
{app="nginx"} != "warn"
如:查询日志中含有 192.168 ip 的行,\d
表示单个数字,等于[0-9]
,\d+
表示多个数字,等于[0-9]+
{app="nginx"} |~ "192.168.\d+.[0-9]+"
如:查询日志中不含有以 192.168 ip结尾的行,且以 web 开头的行
{app="nginx"} !~ "192.168.\d+.\d+$" !~ "^web.*"