![](/img/trans.png)
[英]Terraform error creating a pattern of a aws_cloudwatch_log_metric_filter
[英]How to parse mixed text and JSON log entries in AWS CloudWatch for Log Metric Filter
我正在尝试解析混合了文本和 JSON 的日志条目。第一行是文本表示,接下来的几行是事件的 JSON 有效负载。 一个可能的例子是:
2016-07-24T21:08:07.888Z [INFO] Command completed lessonrecords-create
{
"key": "lessonrecords-create",
"correlationId": "c1c07081-3f67-4ab3-a5e2-1b3a16c87961",
"result": {
"id": "9457ce88-4e6f-4084-bbea-14fff78ce5b6",
"status": "NA",
"private": false,
"note": "Test note",
"time": "2016-02-01T01:24:00.000Z",
"updatedAt": "2016-07-24T21:08:07.879Z",
"createdAt": "2016-07-24T21:08:07.879Z",
"authorId": null,
"lessonId": null,
"groupId": null
}
}
对于这些记录,我尝试将日志指标过滤器定义为 a) 匹配记录 b) select 数据或维度(如果可能)。
根据 AWS 文档 JSON 模式应如下所示:
{ $.key = "lessonrecords-create" }
但是,它不匹配任何内容。 我的猜测是因为在单个日志条目中混合文本和 JSON。
所以,问题是: 1. 是否可以定义一个匹配此日志格式的模式? 2.是否可以从这种日志格式中提取维度、值? 3. 帮我设计一个模式来做这件事。
如果您按照定义的方式设置指标过滤器,则测试将不会注册任何匹配项(我也遇到过这个问题),但是当您部署指标过滤器时,它仍会注册匹配项(至少我的是)。 请记住,没有办法(据我所知)运行此指标过滤器 BACKWARDS (即它只会从创建时捕获数据)。 [如果您想获取过去数据的统计信息,最好使用日志洞察查询]
我目前正在尝试使用不同的解析语句来尝试提取数据(它也是 JSON 和文本的混合),这个线程可能会帮助你(它不适合我) Amazon Cloudwatch Logs Insights with JSON fields 。
更新! 我找到了一种解析文本的方法,但它有点笨拙。 如果您使用 lamda 函数将 cloudwatch 日志导出到 SumoLogic,他们的搜索工具可以进行更好的日志操作,并让您解析 JSON 字段(如果您将整个条目视为文本)。 SumoLogic 也非常有用,因为您可以将搜索结果提取为 CSV。 出于我的目的,我在 SumoLogic 中解析整个日志消息,将所有日志提取为 CSV,然后在 Python 中使用正则表达式过滤并提取我需要的值。
假设您有以下日志
2021-09-29 15:51:18,624 [main] DEBUG com.company.app.SparkResources - AUDIT : {"user":"Raspoutine","method":"GET","pathInfo":"/analysis/123"}
您可以像这样解析它以便能够将“AUDIT:”之后的部分处理为 JSON
fields @message
| parse @message "* [*] * * - AUDIT : *" as timestamp, thread, logLevel, clazz, msg
| filter ispresent(msg)
| filter method = "GET" # You can use fields which are contained in the JSON String of 'msg' field. Do not use 'msg.method' but directly 'method'
您的隔离/解析 JSON 字段中包含的字段会自动添加为查询中可用的字段
您可以将 CloudWatch Events 用于此类目的(又名订阅过滤器),您需要做的是定义一个 CloudWatch 规则,该规则使用表达式语句来匹配您的日志。 在这里,我会让你做所有的阅读:
https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/SubscriptionFilters.html
:)
将消息拆分为 3 个字段,第 3 个字段将是有效的 json 。 我认为在你的情况下会是
fields @timestamp, @message
| parse @message '[] * {"*"}' as field1, field2, field3
| limit 50
field3 是有效的 json。 [INFO} 将是第一个字段。
你可以搜索 JSON 字符串表示,它没有那么强大。
对于你的例子,
而不是{ $.key = "lessonrecords-create" }
试试"\"key\":\"lessonrecords-create\""
。
但是,此过滤器在语义上与您的要求并不相同。 它还将提供key
不在 json 的根目录中的事件。
您可以使用 fluentd 代理将日志发送到 Cloudwatch。 根据您的指标过滤器创建自定义 grok 模式。
步骤:
根据您的日志格式编写您的自定义 grok 模式
请参阅此博客以获取更多信息
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.