23

我正在尝试解析混合了文本和 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
  }
}

对于这些记录,我尝试将 Log Metric Filter 定义为 a) 匹配记录 b) 如果可能,选择数据或维度。

根据 AWS docs JSON 模式应该是这样的:

{ $.key = "lessonrecords-create" }

但是,它不匹配任何东西。我的猜测是因为在单个日志条目中混合了文本和 JSON。

所以,问题是: 1. 是否可以定义一个匹配这种日志格式的模式?2. 是否可以从这种日志格式中提取维度、值?3. 帮我设计一个模式来做到这一点。

4

6 回答 6

1

如果您以您定义的方式设置指标过滤器,测试将不会注册任何匹配项(我也遇到过这个问题),但是当您部署指标过滤器时,它仍然会注册匹配项(至少我的)。请记住,没有办法(据我所知)向后运行这个指标过滤器(即它只会从创建时捕获数据)。[如果您想获取过去数据的统计信息,最好使用日志洞察查询]

我目前正在尝试使用不同的解析语句来尝试提取数据(它也是 JSON 和文本的混合体),这个线程可能会帮助你(它不适合我)Amazon Cloudwatch Logs Insights with JSON fields

更新! 我找到了一种解析文本的方法,但它有点笨拙。如果您使用 lamda 函数将 cloudwatch 日志导出到 SumoLogic,他们的搜索工具可以更好地处理日志并让您解析 JSON 字段(如果您将整个条目视为文本)。SumoLogic 也非常有用,因为您可以将搜索结果提取为 CSV。出于我的目的,我在 SumoLogic 中解析整个日志消息,将所有日志提取为 CSV,然后在 Python 中使用正则表达式过滤并提取我需要的值。

于 2019-02-04T23:58:46.403 回答
0

将消息拆分为 3 个字段,第三个字段将是有效的 json 。我认为在你的情况下

fields @timestamp, @message 
| parse @message '[] * {"*"}' as field1, field2, field3
| limit 50

field3 是有效的 json。[INFO} 将是第一个字段。

于 2021-04-06T19:19:13.810 回答
0

您可以搜索 JSON 字符串表示,它没有那么强大。

对于你的例子,

代替{ $.key = "lessonrecords-create" }

试试"\"key\":\"lessonrecords-create\""

但是,此过滤器在语义上与您的要求不同。它还将给出key不在 json 根目录的事件。

于 2022-03-05T15:21:42.257 回答
0

假设您有以下日志

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 字段中的字段会自动添加为查询中可用的字段

于 2021-09-29T16:30:34.763 回答
0

您可以将 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

:)

于 2020-08-05T06:33:54.437 回答
-2

您可以使用 fluentd 代理将日志发送到 Cloudwatch。根据您的指标过滤器创建自定义 grok 模式。

脚步:

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

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

于 2020-02-11T16:43:41.910 回答