将journald转发到Cloudwatch日志

9

我是一个对CentOS不熟悉的新手,想知道将日志记录解析到CloudWatch Logs的最佳方法。

目前我的思路有:

  • 使用FIFO解析日志并将其摄入Cloudwatch Logs - 看起来这可能会有缺点,如果我们达到了缓冲限制,日志可能会被丢弃。

  • 将日志记录转发到syslog并将syslog发送到Cloudwatch Logs --

基本的想法是让所有内容记录为JSON格式的journald,并将其转发到CloudWatch Logs。

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

3个回答

9
请看 https://github.com/advantageous/systemd-cloud-watch
我们使用journald-cloudwatch-logs时遇到了问题,它根本无法工作。这是因为它不限制发送到CloudWatch的消息或commandLine的大小,CloudWatch返回一个错误,而journald-cloudwatch-logs无法处理,使其失去同步。 systemd-cloud-watch是无状态的,它会询问CloudWatch上次从何处开始。
此外,systemd-cloud-watch还会创建丢失的日志组,并使用名称标签和私有IP地址,以便您可以轻松查找所需的日志。
我们还提供一个packer文件,展示如何构建和配置带有EC2/Centos/Systemd的systemd-cloud-watch镜像。我们提供了一个可行的示例,没有任何关于如何配置systemd的疑问。

嗨Rick,感谢你提供的信息,看起来正是我们想要的。我对Go非常陌生,所以想知道如何安装它?我已经按照这里的步骤进行了操作 - http://www.mammatustech.com/cloud-news/settingup-aws-log-agent-journald-dcos-logs-to-amazon-cloudwatch-log-service但是当我到达“安装代理软件”时,我下载了github仓库,但是从那之后的步骤不匹配。似乎curl命令下载了一个二进制文件,但不确定该怎么做。谢谢 - huhwhatwhere
1
我认为值得注意的是,systemd-cloud-watch分叉并在很大程度上重写了journald-cloudwatch-logs(请参见自述文件的许可证部分)。 - htaccess

6
请看Matin Atkins创建的开源项目https://github.com/saymedia/journald-cloudwatch-logs
该项目创建了一个二进制文件,可以将您的(systemd)journald日志传输到AWS CloudWatch Logs。
该项目依赖于libsystemd直接转发到CloudWatch。它不依赖于转发到syslog。这是一件好事。
该项目似乎使用golang的并发通道来读取日志并批量写入。

太棒了,这正是我在寻找的! - huhwhatwhere

5

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,但现在它们同时运行。


你好Covertlll,目前进展如何?有什么需要注意的地方吗? - Pedro Neri
@PedroNeri 我直接发送日志到 CloudWatch 时遇到了 CloudWatch 日志速率限制问题。我还在解决这个问题。如果找到解决方法,我会更新这个答案的。我将尝试更新配置以增加缓冲区大小。如果那样不起作用,我可能会使用 AWS Kinesis Firehose 或 Kafka 作为日志队列。 - CovertIII
使用journald作为Vector源:https://vector.dev/docs/reference/sources/journald/。使用AWS CloudWatch作为Vector日志汇:https://vector.dev/docs/reference/sinks/aws_cloudwatch_logs/。 - Mike Fogel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接