将日记转发到Cloudwatch日志

时间:2015-10-15 19:44:24

标签: amazon-web-services logging centos amazon-cloudwatch

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

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

  • 使用FIFO解析日志日志并将其提取到Cloudwatch日志, - 如果我们达到缓冲限制,看起来这可能会带来回退,可以删除日志。

  • 将日记日志转发到系统日志并将系统日志发送到Cloudwatch日志 -

这个想法主要是让所有日志都记录为JSON,然后将其转发到CloudWatch Logs。

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

3 个答案:

答案 0 :(得分:6)

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

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

项目取决于libsystemd直接转发到CloudWatch。它不依赖于转发到syslog。这是一件好事。

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

答案 1 :(得分:6)

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

我们遇到了 journald-cloudwatch-logs 的问题。它根本不适用于我们。

它不会限制它发送到CloudWatch的消息或commandLine的大小,并且CloudWatch会发回一个错误,即journald-cloudwatch-logs无法处理,导致它不同步。

systemd-cloud-watch 是无状态的,它会向CloudWatch询问它停止的位置。

如果缺少,

systemd-cloud-watch 也会创建日志组。

systemd-cloud-watch 还使用名称标记和私有IP地址,以便您可以轻松找到所需的日志。

我们还提供了一个打包文件,向您展示如何使用EC2 / Centos / Systemd构建和配置systemd-cloud-watch图像。毫无疑问如何配置systemd因为我们有一个工作示例。

答案 2 :(得分:1)

Vector可用于将日志从日记记录传送到AWS CloudWatch Logs。

journald可以用作源,AWS Cloudwatch Logs可以用作宿。

我正在将其与大约6个EC2实例的现有部署集成在一起,该实例每天生成大约30 GB的日志。我们已经在生产中使用Vector几周后,我将用任何警告或陷阱来更新此答案。

编辑8/17/2020

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

为解决这个问题,在我的设置中,每个日记单元都有自己的日志流。此外,Vector日记记录接收器包含很多字段,我使用矢量变换来删除所有不需要的字段。但是,我仍然遇到速率限制。

编辑10/6/2020

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

我确实遇到的一个问题是导致CPU在主API服务上出现峰值。我为每个服务单元都有一个来源来记录日志日志。我相信这以某种方式阻止了我们的API无法写入日志(虽然不是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还在将日志发送到Logstash的同一框中运行,但从未引起任何问题。一旦向量可靠工作,我们将淘汰弹性堆栈,但现在让它们并排运行。