我想把Kibana查询翻译成LogQL:
host:("test1-myservice-*") AND level:ERROR
AND NOT logger_name:"com.example.ExampleClass"
AND _exists_:stack_trace
AND NOT stack_trace:(
"interrupted"
OR "Read timed out"
OR "java.lang.InterruptedException"
)
我在Grafana Explore中尝试了以下操作,但它不会为我们的JSON日志消息返回任何记录:
{host=~"test1-myservice-.*"} | json
| logger_name != "com.example.ExampleClass"
| stack_trace !=""
| stack_trace =~ ".*InterruptedException.*"
当使用!=
而不是=~
时,它返回所有记录:
{host=~"test1-myservice-.*"} | json
| logger_name != "com.example.ExampleClass"
| stack_trace !=""
| stack_trace !~ ".*InterruptedException.*"
如果我是对的,以下内容适用于JSON日志行的stack_trace
字段的文档:
字符串类型的工作方式与普罗米修斯标签匹配器在日志流选择器中使用的方式完全相同。这意味着您可以使用相同的操作(=,!=,=~,!~(。
来源:标签过滤器表达式
以下似乎有效,但似乎很尴尬:
{host=~"test1-myservice-.*"} | json
| logger_name != "com.example.ExampleClass"
| stack_trace !=""
!~ ".*InterruptedException.*|.*Read timed out.*"
| json
此外,如果我是对的,它在完整的JSON字符串中搜索InterruptedException
和Read timed out
子字符串,而不是仅搜索其stack_trace
字段。
有没有一种更像LogQL的方法可以将上面的Kibana查询转换为LogQL?!~
操作员在这种情况下应该工作吗?
环境:Grafana 7.5.4/8.2.3,Loki:2.4.1
不确定日志行的确切外观,但我认为您不需要提取标签(通过使用| json
这是一篇关于如何编写查询的非常有用的文章。如何使用lokis-logql创建快速查询以在几秒钟内过滤数TB的日志如果您想使查询更可读,还可以使用新的Pattern解析器而不是regex。
因此,在不真正了解日志行外观的情况下,我认为这应该很好地工作:
{host=~"test1-myservice-.*"}
!= "com.example.ExampleClass"
!~ ".*InterruptedException.*|.*Read timed out.*"
根据您的需要,您还可以使用我前面提到的模式解析器。
这是有效的:
{host=~"test1-myservice-.*"} | json
| logger_name != "com.example.ExampleClass"
| stack_trace !=""
| stack_trace !~ "(?s).*InterruptedException.*"
请注意(?s)
,它可以为正则表达式.
字符匹配新行。(JSON日志消息的stack_trace
字段通常包含多行。(
文档的日志流选择器部分也提到了这一点:
注意:
=~
正则表达式运算符是完全锚定的,这意味着正则表达式必须与包括换行符在内的整个字符串匹配。regex.
字符默认情况下与换行符不匹配。如果希望regex点字符与换行符匹配,可以使用单行标志,如下所示:(?s)search_term.+
与search_termn
匹配。