LogQL 中的正则表达式 JSON 过滤

pal*_*int 6 json grafana grafana-loki logql

我想将 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"
)
Run Code Online (Sandbox Code Playgroud)

我在 Grafana Explore 中尝试了以下操作,但它没有返回 JSON 日志消息的任何记录:

{host=~"test1-myservice-.*"} | json 
| logger_name != "com.example.ExampleClass" 
| stack_trace !="" 
| stack_trace =~ ".*InterruptedException.*"
Run Code Online (Sandbox Code Playgroud)

当使用!=代替它时=~,它会返回所有记录:

{host=~"test1-myservice-.*"} | json 
| logger_name != "com.example.ExampleClass" 
| stack_trace !="" 
| stack_trace !~ ".*InterruptedException.*"
Run Code Online (Sandbox Code Playgroud)

如果我是对的,以下内容适用于文档中的stack_traceJSON 日志行字段:

字符串类型的工作方式与日志流选择器中使用的 Prometheus 标签匹配器完全相同。这意味着您可以使用相同的操作(=,!=,=〜,!〜)。

来源:标签过滤表达式

以下似乎有效,但似乎很尴尬:

{host=~"test1-myservice-.*"} | json 
| logger_name != "com.example.ExampleClass" 
| stack_trace !="" 
!~ ".*InterruptedException.*|.*Read timed out.*"
| json
Run Code Online (Sandbox Code Playgroud)

此外,如果我是对的,它会在完整的 JSON 字符串中搜索InterruptedException子字符串,而不仅仅是其字段。Read timed outstack_trace

是否有更类似于 LogQL 的方式将上面的 Kibana 查询转换为 LogQL?!~在这种情况下操作员应该工作吗?

环境:Grafana 7.5.4 / 8.2.3,Loki:2.4.1

Dan*_*inu 6

不确定你的日志行到底是什么样子,但我认为你不需要提取标签(通过使用| json

这是一篇关于如何编写查询的非常有用的文章。 how-to-create-fast-queries-with-lokis-logql-to-filter-terabytes-of-logs-in-seconds如果您想进行查询 ,还可以使用新的模式解析器而不是正则表达式更具可读性。

因此,在不真正了解日志行的情况下,我认为这应该很好用:

{host=~"test1-myservice-.*"}
!= "com.example.ExampleClass" 
!~ ".*InterruptedException.*|.*Read timed out.*"
Run Code Online (Sandbox Code Playgroud)

根据您的需要,您还可以使用我之前提到的模式解析器。


pal*_*int 5

这有效:

{host=~"test1-myservice-.*"} | json 
| logger_name != "com.example.ExampleClass" 
| stack_trace !="" 
| stack_trace !~ "(?s).*InterruptedException.*"
Run Code Online (Sandbox Code Playgroud)

请注意,(?s)它可以匹配正则表达式字符的新行.。(stack_traceJSON日志消息的字段通常包含多行。)

文档的日志流选择器部分也提到了这一点:

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