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

问题描述 投票:0回答:4

我正在使用 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日志。

还有其他办法吗?

docker amazon-ecs amazon-cloudwatchlogs
4个回答
1
投票

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

"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


1
投票

鉴于您定义的用例:

  • 从容器内的 4 个不同文件收集日志
  • 为任务应用 docker log driver awslog

在之前的答案中,您已经看到 awslog 适用于 stdout 作为日志记录机制。此外,据称 awslog 应用于每个容器,这意味着每个正在运行的容器有一个 CloudWatch 日志流。

如果无法切换到所有日志记录的标准输出,则要实现您的目标:

  • 您应用一个单独的容器作为主容器的日志记录机制(记住每个容器一个日志流)
  • 这需要一个单独的容器,它应用 awslogs 驱动程序并按顺序从其他容器读取文件(异步也是可能的,尽管更复杂)并将它们推送到您选择的单独的 CloudWatch 日志流中
  • 这样,如果您愿意,您可以为每个文件拥有单独的日志记录流或组

先决条件:

  1. 主容器和一个单独的日志记录容器,可以访问主容器或主机的卷。

    查看这个问题了解如何通过 docker compose 实现容器之间的共享卷: Docker Compose - 在多个容器之间共享命名卷

  2. 日志记录容器需要与主机 docker 守护进程通信。不建议在 docker 内运行 docker,这里也不需要。

    以下链接可了解如何使日志记录容器与主机 docker 守护进程对话:https://itnext.io/docker-in-docker-521958d34efd

  3. 使用如下 Dockerfile 创建日志记录 docker 容器:

    FROM ubuntu
    ...
    ENTRYPOINT ["cat"]
    CMD ["loggingfile.txt"]
    
  4. 您可以将此容器应用为带有输入参数 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>
    

enter image description here

通过此设置,您将拥有一个单独的 docker 日志记录容器,它与 docker 主机通信并启动另一个 docker 容器来读取主容器的日志文件,并使用完全可自定义的配置将它们推送到 AWS CloudWatch。


0
投票

你必须做两件事:

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

0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.