将多行JSON日志上传到AWS CloudWatch Log

时间:2020-04-24 20:48:07

标签: amazon-web-services amazon-cloudwatch amazon-cloudwatchlogs

put-log-events期望JSON文件需要用[]换行

例如

# aws logs put-log-events --log-group-name my-logs --log-stream-name 20150601 --log-events file://events

[
  {
    "timestamp": long,
    "message": "string"
  }
  ...
]

但是,我的JSON文件采用多行格式,例如

{"timestamp": xxx, "message": "xxx"}
{"timestamp": yyy, "message": "yyy"}

是否可以在不编写自己的程序的情况下上传?

[1] https://docs.aws.amazon.com/cli/latest/reference/logs/put-log-events.html#examples

3 个答案:

答案 0 :(得分:2)

一种无需任何编码即可处理批量发布的简单方法是使用jq在文件中进行必要的转换。 jq是用于执行JSON处理的命令行实用程序。

cat events | jq -s '.'> events-formatted.json
aws logs put-log-events --log-group-name my-logs --log-stream-name 20150601 --log-events file://events-formatted.json

通过这种方式,数据应该被格式化并可以被摄取到CloudWatch。

答案 1 :(得分:0)

如果要将这些行保留为单个事件,则可以将这些行强制转换为字符串,并与\n合并,然后以这种方式发送。

由于行本身看起来像是自给自足的json,因此将它们作为事件数组发送(因此[...])可能并没有那么糟糕,因为它们将进入同一日志组,并且很容易成批查找。

答案 2 :(得分:0)

您将需要按照建议进行转义,然后删除新行。即使这些天有JSON用作使用者格式,但在记录日志时,它也不是很好的原始表示形式。原因是日志可能会被截断。

尝试解析截断的JSON,一点都不有趣!

您也不想在日志中嵌入时间戳,这会破坏您使用cloudwatch的过滤器和搜索功能。

您可以将RAW格式流式传输到cloudwatch日志,然后使用流将原始数据解析,格式化,过滤或进行任何您想做的事情,转化为诸如Elastic Search之类的服务。如果您想对日志做更多的事情而不是cloudwatch所提供的,我建议在AWS上流式传输到Elastic Search服务,并且如果您愿意,您也可以做嵌入式时间戳格式。