AWS ECS容器日志设计模式

3

我有一个经典的Scala应用程序,它在某个位置生成三种不同的日志

/var/log/myapp/log1/mylog.log
/var/log/myapp/log2/another.log
/var/log/myapp/log3/anotherone.log

我将应用程序容器化并且运行良好,我可以通过Docker卷挂载获取这些日志。
现在,该应用程序/容器将部署在AWS ECS中,并具有自动缩放组。在这种情况下,多个容器可能在一个单独的ECS主机上运行。
我想使用CloudWatch监视我的应用程序日志。
一种解决方案是在我的应用程序容器中放置AWS日志代理。
是否有更好的方法将这些应用程序日志从容器传输到CloudWatch日志?
非常感谢您的帮助。
2个回答

4
使用Docker时,推荐的方法是不要记录到文件,而是将日志发送到stdoutstderr。这样可以防止日志被写入容器的文件系统,并且(取决于使用的日志驱动程序),允许您使用docker logs / docker container logs子命令查看日志。
许多应用程序都有一个配置选项,可以记录到stdout/stderr,但如果没有这个选项,您可以创建符号链接来重定向输出;例如,Docker Hub上的官方NGINX镜像使用此方法
Docker支持日志驱动程序,允许您将日志发送到(包括)AWS云监控。在修改了您的镜像使其记录到stdout/stderr之后,您可以配置AWS日志驱动程序。

关于在 Docker 中登录的更多信息,请参阅文档中"logging" section的内容。


感谢@thaJeztah。但是我们的应用程序是遗留应用程序,它不是按照Docker的方式编写的。如果我们编写新应用程序,我们可以遵循Docker的方式。现在我们必须处理遗留应用程序,那么对于我的用例来说,最好的方法是什么? - Know Nothing
@KnowNothing: 这个应用程序是否使用任何日志框架?如果是,那么您可能可以通过自定义配置文件和/或一些系统属性来覆盖当前行为。另一个选项是使用@thaJeztah建议的链接方法,或者您可以尝试直接在容器中运行CloudWatch代理(例如使用监管进程)或作为链接容器与rsyslog之间的中介(两种变体都非常复杂-如果可能的话,我强烈建议链接到stdout或框架重新配置)。 - Szymon Jednac
@KnowNothing 如果你将这些文件的符号链接指向 stdout/stderr,它应该可以工作;你尝试过这样做吗? - thaJeztah
@thaJeztah 链接将起作用,但它将把所有三个日志文件合并为一个日志流,但我们希望在一个日志组下有三个不同的流中有三个日志文件。 - Know Nothing
我们能否在 ECS 主机上安装日志代理并进行卷挂载呢?如果多个容器实例在同一 ECS 主机上运行并具有相同的卷挂载,会发生什么我不确定。 - Know Nothing

0

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