繁体   English   中英

如何在 AWS CloudWatch 中解析混合文本和 JSON 日志条目以进行日志指标筛选

[英]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

https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/Create-CloudWatch-Events-Scheduled-Rule.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 模式。

步骤:

  • 在您的服务器中安装 fluentd 代理
  • 安装 fluent-plugin-cloudwatch-logs 插件和 fluent-plugin-grok-parser 插件
  • 根据您的日志格式编写您的自定义 grok 模式

    请参阅博客以获取更多信息

暂无
暂无

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

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