首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LogQL中的Regexp过滤

LogQL中的Regexp过滤
EN

Stack Overflow用户
提问于 2021-12-10 15:09:43
回答 2查看 5.4K关注 0票数 5

我想把Kibana的查询翻译成LogQL:

代码语言:javascript
复制
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探索中尝试过以下方法,但它不返回JSON日志消息的任何记录:

代码语言:javascript
复制
{host=~"test1-myservice-.*"} | json 
| logger_name != "com.example.ExampleClass" 
| stack_trace !="" 
| stack_trace =~ ".*InterruptedException.*"

当使用!=而不是=~时,它返回所有记录:

代码语言:javascript
复制
{host=~"test1-myservice-.*"} | json 
| logger_name != "com.example.ExampleClass" 
| stack_trace !="" 
| stack_trace !~ ".*InterruptedException.*"

如果我是对的,以下内容将从文档应用到JSON日志行的stack_trace字段:

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

来源:标签过滤表达式

以下几点似乎行得通,但似乎有些尴尬:

代码语言:javascript
复制
{host=~"test1-myservice-.*"} | json 
| logger_name != "com.example.ExampleClass" 
| stack_trace !="" 
!~ ".*InterruptedException.*|.*Read timed out.*"
| json

此外,如果我是对的,它将在完整的JSON字符串中搜索InterruptedExceptionRead timed out子字符串,而不是只搜索它的stack_trace字段。

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

环境: Grafana 7.5.4 / 8.2.3,Loki: 2.4.1

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-14 16:07:47

这样做是可行的:

代码语言:javascript
复制
{host=~"test1-myservice-.*"} | json 
| logger_name != "com.example.ExampleClass" 
| stack_trace !="" 
| stack_trace !~ "(?s).*InterruptedException.*"

注意(?s),它支持与regex .字符匹配的新行。( JSON消息的stack_trace字段通常包含多行。)

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

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

票数 4
EN

Stack Overflow用户

发布于 2021-12-13 12:06:14

不确定日志行的确切外观,但我认为您不需要提取标签(通过使用| json )

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

因此,在不知道日志行的外观的情况下,我认为这应该很好:

代码语言:javascript
复制
{host=~"test1-myservice-.*"}
!= "com.example.ExampleClass" 
!~ ".*InterruptedException.*|.*Read timed out.*"

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70306549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档