我是CentOS的新手,想知道将日志日志解析为CloudWatch Logs的最佳方法。
到目前为止,我的思维过程是:
使用FIFO解析日志日志并将其提取到Cloudwatch日志, - 如果我们达到缓冲限制,看起来这可能会带来回退,可以删除日志。
将日记日志转发到系统日志并将系统日志发送到Cloudwatch日志 -
这个想法主要是让所有日志都记录为JSON,然后将其转发到CloudWatch Logs。
最好的方法是什么?其他人如何解决这个问题?
答案 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的同一框中运行,但从未引起任何问题。一旦向量可靠工作,我们将淘汰弹性堆栈,但现在让它们并排运行。