如何在Grafana中检查line_format表达式中的嵌套元素?

问题描述 投票:0回答:1

我正在使用

line_format
创建更好的日志消息,我想过滤掉一些嵌套的 json 标签。

我目前有以下代码

{application="app", environment="Production", level="error"} 
| pattern `<_entry>` 
| json
| line_format "\033[1;37m{{ .Message }}\033[0m\n{{ range $k, $v := (fromJson ._entry)}}{{if ne $k \"Message\" }}{{if ne $k \"MessageTemplate\"}}\033[1;30m{{$k}}: \033[0m\033[2;37m{{$v}}\033[0m {{ end }}{{ end }}{{ end }}"

我得到以下日志行:

    
An unhandled exception has occurred while executing the request.
EventId: map[Id:1 Name:UnhandledException] ParentId: 0000000000000000 RequestId: 800017c6-0001-fb00-b63f-84710c7967bb RequestPath: /Instrumentation/SetGauge/ SourceContext: Microsoft.AspNetCore.Diag

EventId
是一个具有两个字段的对象:
Id
Name
。可以说我想过滤掉“Id”部分。

在代码的

{{ range $k, $v := (fromJson ._entry)}}{{if ne $k \"Message\" }}....{{end}}
部分,
$k
EventId
$v
是对象
{Id:1,Name:'UnhandledException'}

我想添加一个

if
来过滤掉
EventId.Id

如何做到这一点?

作为第二个问题;如何将所有这些

if
与 和 OR 结合起来?我使用了
or
||
但没有任何作用,这种语言中的
or
是什么。 (我也可以参考这个脚本语言是什么?不是 LogQl,我的意思是 line_format 脚本语言)

grafana go-templates grafana-loki
1个回答
1
投票

我建议您使用 LogQL 分析器来分享您正在运行的查询示例。它甚至可以帮助您调试查询本身。

在这里我尝试重现您的示例

如果 json 文档中只有

EventID
包含对象,那么您可以执行
if
来捕获
EventID
键并以自定义方式处理它,以从内部对象中提取名称。

您可能已经知道,

line_format
在底层使用 Go 的模板引擎,因此您可以使用 其语法来索引映射(在本例中为
$v
)。

| pattern `<_entry>`
| json
| line_format "{{ .Message }}\n{{ range $k, $v := (fromJson ._entry)}}{{if ne $k \"Message\" }}{{if ne $k \"MessageTemplate\"}}{{$k}}: {{if eq $k \"EventID\"}} {{index $v \"Name\"}} {{else}} {{$v}} {{end}} {{ end }}{{ end }}{{ end }}"

注意新的

{{if eq $k \"EventID\"}} {{index $v \"Name\"}} {{else}} {{$v}} {{end}}
部分。

这是 LogQL 分析器的示例

© www.soinside.com 2019 - 2024. All rights reserved.