繁体   English   中英

使用 JSON 字段的 Amazon Cloudwatch Logs Insights

[英]Amazon Cloudwatch Logs Insights with JSON fields

我正在尝试将 Logs Insights 与其中一个字段中包含 JSON 的数据一起使用,并解析 JSON 字段

当我使用入门代码将其放入 insights 时,我的数据如下所示

fields @timestamp, @message
| sort @timestamp desc
| limit 25

如何轻松提取嵌套 JSON 中的path变量以对其执行聚合? 通过查看一些文档,我认为@message.path可以工作,但似乎并非如此。 有没有人在 Insights 中成功解释 JSON 日志

在此处输入图像描述

编辑:我的数据样例

#
@timestamp
@message
1
2018-12-19 23:42:52.000
I, [2018-12-19T23:42:52.629855 #23447] INFO -- : [2ce588f1-c27d-4a55-ac05-62a75b39e762] {"method":"GET","path":"/api/v1/professionals/ID","format":"json","controller":"API::V1::Public::ProfessionalsController","action":"show","status":200,"duration":285.27,"view":222.36,"time":"2018-12-19T23:42:52.344+00:00","params":{"include":"user,tags,promotions,company_sector,similar_professionals.tags,similar_professionals.user","format":"json","compress":false,"id":"ID"},"@timestamp":"2018-12-19T23:42:52.629Z","@version":"1","message":"[200] GET /api/v1/professionals/ID (API::V1::Public::ProfessionalsController#show)"}
@logStream  i-05d1d61ab853517a0
@message  I, [2018-12-19T23:42:52.629855 #23447] INFO -- : [2ce588f1-c27d-4a55-ac05-62a75b39e762] {"method":"GET","path":"/api/v1/professionals/ID","format":"json","controller":"API::V1::Public::ProfessionalsController","action":"show","status":200,"duration":285.27,"view":222.36,"time":"2018-12-19T23:42:52.344+00:00","params":{"include":"xxx","format":"json","compress":false,"id":"ID"},"@timestamp":"2018-12-19T23:42:52.629Z","@version":"1","message":"[200] GET /api/v1/professionals/ID (API::V1::Public::ProfessionalsController#show)"}
@timestamp  1545262972000
2
2018-12-19 23:42:16.000
I, [2018-12-19T23:42:16.723472 #851] INFO -- : [ea712503-eb86-4a6e-ab38-ddbcd6c2b4d0] {"method":"GET","path":"/api/v1/heartbeats/new","format":"json","controller":"API::V1::Public::HeartbeatsController","action":"new","status":201,"duration":9.97,"view":3.2,"time":"2018-12-19T23:42:16.712+00:00","params":{"format":"json","compress":false},"@timestamp":"2018-12-19T23:42:16.722Z","@version":"1","message":"[201] GET /api/v1/heartbeats/new (API::V1::Public::HeartbeatsController#new)"}

CloudWatch Insights Logs 自动发现以下日志类型的字段:

Lambda 日志

CloudWatch Logs Insights 会自动发现 Lambda 日志中的日志字段,但仅限于每个日志事件中的第一个嵌入式 JSON 片段(注意:强调我的)。 如果 Lambda 日志事件包含多个 JSON 片段,您可以使用 parse 命令解析和提取日志字段。 有关详细信息,请参阅 JSON 日志中的字段。

CloudTrail 日志

查看JSON 日志中的字段

来源: 支持的日志和发现的字段

如果@messageI, [2018-12-11T13:20:27] INFO --: {"method":"GET"}

然后你可以像这样选择和过滤字段:

fields @timestamp, @message, method
| filter method = "GET"
| sort @timestamp desc

它也适用于嵌套字段,即params.format = "json"results.0.firstName = "Paul"

您可以使用parse命令来提取字段。

如果@message

I, [2018-12-11T13:20:27] INFO -- : {"method":"GET"}

然后你像这样提取字段:

fields @timestamp, @message
| parse "I, [*T*] INFO -- : {"method":"*"}" as @date, @time, @method
| filter method=GET
| sort @timestamp desc
| limit 20

目前文档相当简单。 我可以通过将通配符*替换为正则表达式来获得结果,但随后解析失败。

@pyb insights的基础上,我能够使用parse @message '"path":"*"' as path@message中的任何位置提取路径的路径。

您可以继续通过将另一个parse @message '"method":"*"' as method来获取您的方法,而不用担心排序,因为它是对@message的第二次全局纯文本搜索

如果您的@message是:

I, [2018-12-19T23:42:52.629855 #23447] INFO -- : [2ce588f1-c27d-4a55-ac05-62a75b39e762] {"method":"GET","path":"/api/v1/professionals/ID","format":"json","controller":"API::V1::Public::ProfessionalsController","action":"show","status":200,"duration":285.27,"view":222.36,"time":"2018-12-19T23:42:52.344+00:00","params":{"include":"xxx","format":"json","compress":false,"id":"ID"},"@timestamp":"2018-12-19T23:42:52.629Z","@version":"1","message":"[200] GET /api/v1/professionals/ID (API::V1::Public::ProfessionalsController#show)"}

使用:

parse @message '"path":"*"' as path | parse @message '"method":"*"' as method

将导致以下字段: path = '/api/v1/professionals/ID' and method = 'GET'

请注意,这仍然只是字符串解析,因此,它没有嵌套键的概念,例如params.format找不到json ,但是只要使用format就可以,只要您的@message中的任何地方都没有其他format字符串。

另请注意,这是针对 Insights 未在消息中发现您的 JSON 的情况。 我相信 @pyb 在这个答案中指的就是这种情况。 使用以下格式未发现我的日志

info - Request: {"method":"POST","path":"/auth/login/","body":{"login":{"email":"email@example.com","password":"********"}},"uuid":"36d76df2-aec4-4549-8b73-f237e8f14e23","ip":"*.*.*.*"}

还有另一个在正则表达式帮助下的解析

假设您的@message是:

I, [2018-12-19T23:42:52.629855 #23447] INFO -- : [2ce588f1-c27d-4a55-ac05-62a75b39e762] {"method":"GET","path":"/api/v1/professionals/"}

您可以通过以下方式提取方法

fields @timestamp, @message
| parse @message /\"method\":\"(?<method_type>.*?)\"/

parse 命令中的这个正则表达式查询对你有帮助吗?

filter @message like / \"path\":\"/
| parse @message /(?<@endpt>((\/[a-zA-Z0-9_{}()-?]+){1,}))/

祝你好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM