如何使用docker ecs容器设置aws cloudwatch日志

时间:2018-06-03 03:01:32

标签: docker amazon-ecs amazon-cloudwatchlogs

我正在使用Amazon ECS和docker镜像正在使用php应用程序。 一切都很顺利。

在入口点我在前台使用supervisord,这些日志当前发送到云监视日志。

在我的泊坞窗图片中,我有日志发送到文件

/var/log/apache2/error.log
/var/log/apache2/access.log
/var/app/logs/dev.log
/var/app/logs/prod.log

现在我想将这些日志发送到aws cloudwatch。什么是最好的方式。 此外,我有单个应用程序的多个容器,所以所有的foour容器将有这些日志。

最初我想在容器本身安装aws日志代理,但我必须使用相同的docke rimage用于本地和ci和nonprod环境,所以我不想在那里使用cloudwatch日志。

还有其他办法吗?

4 个答案:

答案 0 :(得分:0)

你必须做两件事:

  1. 配置ECS任务定义以从容器输出中获取日志并将其传输到CloudWatch日志组/流中。为此,您需要为ECS任务定义中的每个ContainerDefinition属性添加一个LogConfiguration属性。您可以查看此hereherehere的文档。
  2. 而不是将日志写入容器中的文件,而是将其写入/dev/stdio/dev/stdout / /dev/stderr。您可以在Apache配置中使用这些路径,并且应该看到输出到容器日志的Apache日志消息。

答案 1 :(得分:0)

您可以使用Docker的awslogs日志记录驱动程序

请参阅有关如何设置的文档 https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_awslogs.html

答案 2 :(得分:0)

在任务定义中,如下指定日志记录配置:

"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

答案 3 :(得分:0)

给出您定义的用例:

  • 从容器中收集来自4个不同文件的日志
  • 为任务应用docker日志驱动程序 awslog

在您先前已经看到的答案中,awslog将stdout用作日志记录机制。此外,已经指出,每个容器都应用awslog,这意味着每个运行中的容器一个aws云日志流。

要在所有日志切换到标准输出时实现您的目标不是您的选择:

  • 您将单独的容器用作主容器的日志记录机制(每个容器记住一个日志流)
  • 这将导致一个单独的容器,该容器将应用awslogs驱动程序并按顺序从另一个容器中读取文件(也可能是异步的,更加复杂),并将它们推送到您选择的单独的aws云日志流中
  • 这样,对于每个文件,如果需要,您将拥有单独的日志记录流或组

先决条件:

  1. 主容器和单独的日志记录容器,可以访问一定数量的主容器或HOST

查看此问题,如何实现容器之间的共享卷 通过泊坞窗撰写: Docker Compose - Share named volume between multiple containers

  1. 日志记录容器需要与主机docker守护程序对话。不建议在docker内部运行docker,这里也不需要!

这里是一个链接,用于查看如何使日志记录容器与主机docker守护程序https://itnext.io/docker-in-docker-521958d34efd对话

  1. 使用如下所示的Dockerfile创建日志记录Docker容器:

    从ubuntu
    ...
    ENTRYPOINT [“ cat”]
    CMD [“ loggingfile.txt”]

  2. 您可以将此容器作为具有输入参数 logging_file_name 的函数来应用,以写入stdout并直接写入AWS Cloudwatch:

    docker run -it --log-driver = awslogs
    --log-opt awslogs-region =地区
    --log-opt awslogs-group =您定义的组名
    --log-opt awslogs-stream =您定义的流名称
    --log-opt awslogs-create-group = true


enter image description here

通过此设置,您有一个单独的docker日志记录容器,该容器与docker主机进行通信,并启动另一个docker容器以读取主容器的日志记录文件,并将它们推送到完全由您定制的AWS Cloudwatch。