我正在使用 Amazon ECS,docker 镜像正在使用 php 应用程序。 一切都运行良好。
在入口点,我在前台使用
supervisord
,这些日志当前发送到 cloudwatch 日志。
在我的 docker 映像中,我将日志发送到文件
/var/log/apache2/error.log
/var/log/apache2/access.log
/var/app/logs/dev.log
/var/app/logs/prod.log
现在我想将这些日志发送到 aws cloudwatch。最好的方法是什么。 另外,我有多个用于单个应用程序的容器,因此示例所有四个容器都将具有这些日志。
最初我想在容器本身中安装aws日志代理,但我必须在本地、ci和非prod环境中使用相同的docker image,所以我不想在那里使用cloudwatch日志。
还有其他办法吗?
在任务定义中,指定日志记录配置,如下所示:
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "LogGroup",
"awslogs-region": "us-east-1",
"awslogs-stream-prefix": "Prefix"
}
}
awslogs-stream-prefix
对于 EC2
启动类型是可选的,但对于 Fargate
在启动新实例时的
UserData
部分中,将该实例注册到集群并确保同时指定类型 awslogs
的日志记录:
#!/bin/bash
echo 'ECS_CLUSTER=ClusterName' > /etc/ecs/ecs.config
echo ECS_AVAILABLE_LOGGING_DRIVERS='[\"json-file\", \"awslogs\"]' >> /etc/ecs/ecs.config
start ecs
更多信息:
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_awslogs.html
鉴于您定义的用例:
在之前的答案中,您已经看到 awslog 适用于 stdout 作为日志记录机制。此外,据称 awslog 应用于每个容器,这意味着每个正在运行的容器有一个 CloudWatch 日志流。
如果无法切换到所有日志记录的标准输出,则要实现您的目标:
先决条件:
主容器和一个单独的日志记录容器,可以访问主容器或主机的卷。
查看这个问题了解如何通过 docker compose 实现容器之间的共享卷: Docker Compose - 在多个容器之间共享命名卷
日志记录容器需要与主机 docker 守护进程通信。不建议在 docker 内运行 docker,这里也不需要。
以下链接可了解如何使日志记录容器与主机 docker 守护进程对话:https://itnext.io/docker-in-docker-521958d34efd
使用如下 Dockerfile 创建日志记录 docker 容器:
FROM ubuntu
...
ENTRYPOINT ["cat"]
CMD ["loggingfile.txt"]
您可以将此容器应用为带有输入参数 logging_file_name 的函数,以写入标准输出并直接写入 AWS CloudWatch:
docker run -it --log-driver=awslogs \
--log-opt awslogs-region= region \
--log-opt awslogs-group= your defined group name \
--log-opt awslogs-stream= your defined stream name \
--log-opt awslogs-create-group=true \
<Logging_Docker_Image> <logging_file_name>
通过此设置,您将拥有一个单独的 docker 日志记录容器,它与 docker 主机通信并启动另一个 docker 容器来读取主容器的日志文件,并使用完全可自定义的配置将它们推送到 AWS CloudWatch。
您可以使用 Docker 的 awslogs 日志记录驱动程序
请参阅有关如何设置的文档 https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_awslogs.html