从日志条目中的 json 中提取 json 值

Posted

技术标签:

【中文标题】从日志条目中的 json 中提取 json 值【英文标题】:Extracting json value from json within a log entry 【发布时间】:2020-04-30 02:59:58 【问题描述】:

使用 sumologic,我如何对消息部分为 json(因此不完全)的日志条目执行查询?

示例条目:

[2020-04-30 02:10:32] 生产。警告:我们受到速率限制 "class":"App\WebhookService\WebhookExecutor","headers":"Date":["Thu, 30 2020 年 4 月 02:10:32 GMT"],"Content-Type":["application/json"],"Content-Length":["88"],"Connection":["keep-alive"],"设置 Cookie":...

我有很多不同类路径的此类错误,有些是 webhook 执行,有些是不同的对象。我的最终目标是能够计算每个类名的日志条目,如下所示:

WebhookExecutor     | 156
SyncDataService     | 48
DeleteService       | 13

我从以下内容开始:

"We were rate limited" | json auto | json "class"

我对 ^ 的期望是它会在我的日志搜索结果中创建一个名为 class 的列,然后我可以按此分组、计数等。

【问题讨论】:

【参考方案1】:

不确定“部分 Json”是什么意思? 即:

    日志消息包含其他文本和正确的 Json 或者消息包含类似于 Json 的内容,但不是真正的 Json - 例如Json 消息的前缀

假设选项 1(其他文本 + 正确的 Json)

您需要将您的 Json 提取到它自己的适当字段中。否则| json auto 无法接机。

所以:

"We were rate limited"
| parse "We were rate limited *" as limitedJson
| json auto
| count by class

应该做的工作。 甚至不需要第一行,因为parse 也会进行过滤。

假设选项 2(没有正确的 Json,只是类似的东西)

在这种情况下比较困难,但仍然可行。

我还没有测试过,但是这样的东西应该可以工作:

"We were rate limited"
| parse "\"class\":\"*\"" as class
| count by class

在这里转义嵌套引号看起来不太好。


免责声明:我目前受雇于 Sumo Logic。

【讨论】:

感谢您的跟进! “部分 json” 我指的是上面包含的示例日志条目,它以消息开头,然后 json 开始。我不太明白 为什么 需要解析,因为json auto 的文档似乎表明它能够智能地提取 json? help.sumologic.com/05Search/Search-Query-Language/…。即便如此,选项 2 非常适合我的用例,谢谢! 有趣。老实说,我不知道。可能是“如果内容出现在 json blob 之后的消息末尾,则提取可能会失败。”?您粘贴的内容是真实的日志消息还是编辑过的?即省略号是实际日志行的一部分还是仅用于发布到 ***? ... 已编辑。但你是对的。日志条目的上下文被切断,因为 json blob 太大,所以弄乱了 json。好电话:)

以上是关于从日志条目中的 json 中提取 json 值的主要内容,如果未能解决你的问题,请参考以下文章

如何从 MySQL 中的数字键嵌套 JSON 字段中提取值

如何将多个键值条目的 JSON 对象反序列化为 Rust 中的自定义结构

Nx e2e cypress runner:来自 cypress.env.json 条目的值不会覆盖 cypress.json env 对象中的相同条目

Phpmyadmin 仅接受来自具有多个输入值的 json 数组中的一个条目

从 PHP 中的循环中排除(黑名单)多个 Json 条目

使用Ansible从Json输出中提取数据