我是一个对CentOS不熟悉的新手,想知道将日志记录解析到CloudWatch Logs的最佳方法。
目前我的思路有:
使用FIFO解析日志并将其摄入Cloudwatch Logs - 看起来这可能会有缺点,如果我们达到了缓冲限制,日志可能会被丢弃。
将日志记录转发到syslog并将syslog发送到Cloudwatch Logs --
基本的想法是让所有内容记录为JSON格式的journald,并将其转发到CloudWatch Logs。
什么是最好的方法?其他人是如何解决这个问题的?
我是一个对CentOS不熟悉的新手,想知道将日志记录解析到CloudWatch Logs的最佳方法。
目前我的思路有:
使用FIFO解析日志并将其摄入Cloudwatch Logs - 看起来这可能会有缺点,如果我们达到了缓冲限制,日志可能会被丢弃。
将日志记录转发到syslog并将syslog发送到Cloudwatch Logs --
基本的想法是让所有内容记录为JSON格式的journald,并将其转发到CloudWatch Logs。
什么是最好的方法?其他人是如何解决这个问题的?
libsystemd
直接转发到CloudWatch。它不依赖于转发到syslog。这是一件好事。Vector可以用来将日志从journald发送到AWS CloudWatch Logs中。
journald可作为数据源,AWS CloudWatch Logs则可作为数据汇。
我正在将其与已有的6个EC2实例部署进行集成,每天生成约30 GB的日志。在我们使用Vector生产环境几周后,我将通过更新此答案提供任何警告或问题。
编辑日期:8/17/2020
需要注意几点。PutLogEvents的匹配批处理大小为1MB,并且每个流每秒最多只能发送5个请求。请参阅这里的限制。
为了帮助解决这些问题,在我的设置中,每个journald单元都有自己的日志流。此外,Vector journald sink包含许多字段,我使用vector transform删除了所有不需要的字段。然而,我仍然遇到速率限制的问题。
编辑日期:10/6/2020
我现在已将其投入生产中。我不得不将使用的vector版本从0.8.1更新到0.10.0,以解决vector不遵守AWS CloudWatch日志每个批处理最大字节数要求的问题。至于我遇到的速率限制问题,事实证明我并没有遇到任何问题。我在vector日志中得到了这条消息:tower_limit::rate::service: rate limit exceeded, disabling service
。这实际上意味着vector会暂时停止发送日志以遵守汇的速率限制。此外,每个Cloudwatch Log Stream每小时可以消耗高达18 GB,这对于我每天需要为6个虚拟机上的超过30个不同服务生成30 GB的要求来说是可以接受的。
我遇到的一个问题是导致我们主要的API服务CPU飙升。我为每个服务单元设置了一个源以跟踪journald日志。我认为这样会阻止我们的API无法写入journald(但不能百分之百肯定)。我所做的是只有一个源,并指定多个单位进行跟踪,因此仅有一个命令跟踪日志,并增加了批处理大小,因为每个服务生成大量日志。然后,我使用vector的模板语法基于服务名称拆分Log Group和Log Stream。以下是示例配置:
[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在获取日志并将其发送到AWS CloudWatch时会占用该计算机的80% CPU。Filebeat也在同一台机器上运行,并将日志发送到Logstash,但从未引起任何问题。一旦我们成功地让Vector可靠地工作,我们将淘汰Elastic Stack,但现在它们同时运行。