如何将多个日志文件发送到Amazon CloudWatch?

3
我有一个单体应用,目前正在被转移到aws上(使用ecs/fargate),将来它将被拆分成微服务。它使用一个amazon linux 1镜像配置了apache、php和所有生产网站数据。现在,它将日志发送到/etc/httpd/logs和/var/www/vhosts/logs中的几个文件中。
据说在ecs任务定义中可以使用日志配置和卷来处理这种情况,但我没有找到任何解释如何操作的详细信息。
1个回答

2
如果是容器,我不建议将日志写入文件,最好将日志写入容器的stdout和stderr。另一个有趣的问题是,如果你转移到fargate,你该如何处理日志文件?因此,不要将日志写入文件,也不要像对待实例机器一样对待容器。
AWS日志驱动程序的美妙之处在于,它将日志推送到Cloud Watch日志中,并且从Cloud Watch中也非常容易将这些日志推送到ELK。
选择AWS日志驱动程序,在设计entrypoint时,以使其以容器的stdout和stderr方式写入日志。通常情况下,当你在前台运行进程时,它会自动将日志写入容器的stdout。
只需在任务定义中添加此行并添加Cloud Watch角色即可。
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "awslogs-wordpress",
                    "awslogs-region": "us-west-2",
                    "awslogs-stream-prefix": "awslogs-example"
                }
            }

或者enter image description here

一旦配置完成,您将看到日志

enter image description here

使用awslogs日志驱动程序

您可以配置任务中的容器将日志信息发送到CloudWatch Logs。如果您正在使用Fargate启动类型来运行任务,则可以从容器中查看日志。如果您正在使用EC2启动类型,则可以在一个方便的位置查看来自容器的不同日志,并防止容器日志占用容器实例上的磁盘空间。本主题可帮助您开始在任务定义中使用awslogs日志驱动程序。

注意

容器中记录的信息类型主要取决于其ENTRYPOINT command。默认情况下,捕获的日志显示您通常在本地运行容器时在交互式终端中看到的命令输出,即STDOUTSTDERR I/O streamsawslogs日志驱动程序仅将这些日志从Docker传递到CloudWatch Logs。有关处理Docker日志的更多信息,包括捕获不同文件数据或流的替代方法,请参阅Docker文档中的查看容器或服务的日志。

enter image description here aws-ecs-log-driver


2
有趣。将日志文件重定向到stdout/stderr不仅是默认解决方案,而且是推荐的解决方案吗?现在我想想,我想容器中存储文件的位置(如果有的话)真的无关紧要,因为所有这些东西都应该存储在容器外部。一旦单体应用程序被拆分成微服务,我可能就不需要多个文件位置来存储日志了。 - Brandon
1
在微服务中,每个容器只有一个进程,因此每个容器只有一个文件。 - Adiii
如果您有一个应用程序,例如,有完全不同类别的3个不同日志文件,应该流式传输到不同的CloudWatch日志组中,那么这会有什么帮助? - Base Desire
为了支持多个日志组,创建额外的容器来读取日志文件,将内容流式传输到Docker日志,然后将该容器的AWS日志驱动程序绑定到您特定的日志组。 - Drewry Pope

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