我正在使用
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 脚本语言)
我建议您使用 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 分析器的示例。