将日志转发到 Cloudwatch Logs

Forwarding journald to Cloudwatch Logs

我是 CentOS 的新手,想知道将日志日志解析到 CloudWatch Logs 的最佳方法。

到目前为止我的思维过程是:

这个想法本质上是让所有内容都以 JSON 的形式记录到 journald,然后将其转发到 CloudWatch Logs。

最好的方法是什么?其他人是如何解决这个问题的?

看看 Matin Atkins 的 https://github.com/saymedia/journald-cloudwatch-logs

这个开源项目创建了一个完全符合您要求的二进制文件 - 将您的 (systemd) journald 日志发送到 AWS CloudWatch Logs。

项目依赖libsystemd直接转发到CloudWatch。它不依赖于转发到系统日志。这是好事。

该项目似乎使用 golang 的并发通道来读取日志和批量写入。

看看https://github.com/advantageous/systemd-cloud-watch

我们在使用 journald-cloudwatch-logs 时遇到了问题。它根本不适合我们。

它不限制发送到 CloudWatch 的消息或命令行的大小,并且 CloudWatch 发回 journald-cloudwatch-logs 无法处理的错误,这导致它不同步。

systemd-cloud-watch 是无状态的,它会询问 CloudWatch 在何处停止。

systemd-cloud-watch 如果丢失,也会创建日志组。

systemd-cloud-watch 还使用了name tag和私有ip地址,这样你就可以轻松找到你要找的日志。

我们还包含一个加壳文件,向您展示如何使用 EC2/Centos/Systemd 构建和配置 systemd-cloud-watch 映像。没有关于如何配置 systemd 的问题,因为我们有一个工作示例。

Vector 可用于将日志从 journald 发送到 AWS CloudWatch Logs。

journald can be used as a source and AWS Cloudwatch Logs 作为水槽。

我正在努力将其与现有的大约 6 个 EC2 实例部署相集成,这些实例每天生成大约 30 GB 的日志。在我们在生产环境中使用 Vector 数周后,我会用任何注意事项或陷阱更新此答案。

编辑 2020 年 8 月 17 日

一些需要注意的事情。 PutLogEvents 的匹配批处理大小为 1MB,每个流每秒最多有 5 个请求。 See the limits here..

为此,在我的设置中,每个日志单元都有自己的日志流。此外,Vector journald sink 包含很多字段,我使用矢量变换删除了所有我不需要的字段。但是,我仍然 运行 遇到速率限制。

编辑 2020 年 10 月 6 日

我现在正在生产这个 运行ning。我必须将我使用的 vector 版本从 0.8.1 更新到 0.10.0,以解决 vector 不遵守 AWS CloudWatch 日志每批次最大字节数要求的问题。至于我遇到的速率限制问题,事实证明我没有遇到任何问题。我在矢量日志 tower_limit::rate::service: rate limit exceeded, disabling service 中收到此消息。这实际上意味着 vector 暂时暂停发送日志以遵守接收器的速率限制。此外,每个 Cloudwatch 日志流每小时最多可消耗 18 GB,这足以满足我每天 30 GB 的需求,在 6 个虚拟机上提供超过 30 种不同的服务。

我 运行 解决的一个问题是导致 CPU 在我们的主要 API 服务上出现峰值。我为每个服务单元提供了一个来源来跟踪 journald 日志。我相信这在某种程度上阻止了我们的 API 无法写入 journald(尽管不是 100%)。我所做的是有一个源并指定要遵循的多个单元,因此只有一个命令跟踪日志,并且我增加了批处理大小,因为每项服务都会生成大量日志。然后我使用 vector 的模板语法根据服务名称拆分日志组和日志流。下面是一个示例配置:

[sources.journald_logs]
  type = "journald"
  units = ["api", "sshd", "vector", "review", "other-service"]
  batch_size = 100

[sinks.cloud_watch_logs]
  type = "aws_cloudwatch_logs"
  inputs = ["journald_logs"]
  group_name = "/production/{{host}}/{{_SYSTEMD_UNIT}}"
  healthcheck = true
  region = "${region}"
  stream_name = "{{_SYSTEMD_UNIT}}"
  encoding = "json"

我还有最后一个问题需要解决,但它与这个问题无关。我正在使用 nginx 的文件源,因为它会写入访问日志文件。 Vector 消耗了该机器上 80% 的 CPU 来获取日志并将它们发送到 AWS CloudWatch。 Filebeat 也在同一个盒子上 运行s 将日志发送到 Logstash,但它从未引起任何问题。一旦我们让 vector 可靠地工作,我们将淘汰 Elastic Stack,但现在我们 运行 并排使用它们。