【问题标题】:How can i setup aws cloudwatch logs with docker ecs container我如何使用 docker ecs 容器设置 aws cloudwatch 日志
【发布时间】:2018-06-03 03:01:31
【问题描述】:

我正在使用 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 和非生产环境中使用相同的 docker rimage,所以我不想在那里使用 cloudwatch 日志。

还有其他方法吗?

【问题讨论】:

    标签: docker amazon-ecs amazon-cloudwatchlogs


    【解决方案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

    【讨论】:

    • 我们如何收集 JVM 指标,包括从 ecs 到云手表的 GC 日志
    【解决方案2】:

    你必须做两件事:

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

    【讨论】:

    • 第二件事的问题是,所有文件的日志将进入单个流,而我希望将 10 个文件的日志转到单独的文件
    • @Mirage 可能不是您想听到的,但根据我的经验,这不是一个真正的问题。您可以使用 awslogs (github.com/jorgebastida/awslogs) 从日志组中获取日志。或者,您可以更改日志格式以包含主机名(请参阅httpd.apache.org/docs/current/mod/mod_log_config.html),这样可以更轻松地过滤来自特定主机的流量。我不知道有任何方法可以按照您想要的方式处理日志。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      鉴于您定义的用例:

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

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

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

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

      先决条件:

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

      查看这个问题如何实现容器之间的共享卷 通过码头工人撰写: Docker Compose - Share named volume between multiple containers

      1. 日志容器需要与主机 docker 守护进程通信。不推荐在 docker 中运行 docker,这里也不需要!

      这里有一个链接,可以查看如何使日志容器与主机 docker 守护进程https://itnext.io/docker-in-docker-521958d34efd 对话

      1. 使用这样的 Dockerfile 创建日志记录 docker 容器:

        来自 ubuntu
        ...
        入口点 [“猫”]
        CMD ["loggingfile.txt"]

      2. 您可以将此容器作为具有输入参数的函数应用 logging_file_name 以写入标准输出并直接写入 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


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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-28
        • 2019-07-06
        • 2021-09-28
        • 2019-03-27
        • 2019-12-01
        • 2017-11-23
        • 1970-01-01
        相关资源
        最近更新 更多