如何从 AWS EC2 和 Docker 容器中检索日志以确保万无一失?

如何从 AWS EC2 和 Docker 容器中检索日志以确保万无一失?

目前,我们的设置如下:

多台 AWS EC2 机器,其中一些正在运行 Docker 容器,一些则没有 Docker。为了检索 Syslog、Web 服务器日志(Apache)和应用程序日志,我们在 EC2 实例上运行了一个 Fluentd 代理(td-agent)。它们将错误日志消息转发到集中式 Fluentd 服务器(日志聚合器),然后将其发送到 Graylog。对于访问日志,实例上的所有 td-agent 都会将它们直接转发到 AWS Kinesis Firehose,后者又每 5 分钟将它们存储在 S3 上(缓冲),并可供 AWS Athena 搜索。Docker 容器上的访问日志写入 stdout,错误日志写入 stderr。fluentd 的 docker 日志记录驱动程序用于将它们转发到安装在相应主机上的 td-agent。

现在,此设置存在一些问题:

  1. 无法实时查看访问日志(例如,供开发人员进行调试)
  2. 在高负载下,td-agents 的缓存/缓冲可能会成为问题
  3. 当日志聚合器或 td-agents 停止服务时,td-agents 或 Docker 容器的缓存/缓冲可能会出现问题

由于价格和其他原因,我们不使用 CloudWatch Logs。使用真实日志文件还意味着我们需要定期轮换它们,注意磁盘空间等。最后一点可以通过使用 RAM 磁盘或单独的驱动器来解决。但这并不能解决固定大小的缓存/缓冲区可能会变满并阻止传入日志的实际问题。

解决这个问题有什么更好的方法吗?有没有关于记录 Docker 容器的最佳实践?

答案1

如果有人在这里遇到困难并想知道如何去做,以下是我们的选择以及我们最终的承诺:

  1. Docker 的 fluentd 日志驱动程序:本来会很棒,但您无法轻松限制文件输出插件的大小。仅使缓冲区可见的黑客攻击也没有成功。
  2. Docker 的 json-file 日志驱动程序:您可以限制日志文件的数量及其大小。它们很容易通过 查看docker logs,但它们是可跟踪的仅适用于 root 用户它们不应该被自动化系统跟踪。相信我,我试过了,但并不值得。有几个缺点,包括不支持tag指令,td-agent 至少需要 30 秒才能使用新容器的日志文件等等。
  3. Docker 的 Syslog 日志驱动程序:这是我们现在使用的。它支持tag,其他用户可以查看和 grep 以获取实时概览,并且与 td-agent 配合得很好。缺点:增加了另一项服务和开销。不支持docker logs。此外,可能存在速率限制等问题。

相关内容