如何在Docker ECS容器中设置AWS CloudWatch日志记录

3

我正在使用Amazon ECS,docker镜像使用的是php应用程序。一切都运行正常。

在入口点中,我使用supervisord前台运行,并将这些日志发送到云监控日志。

在我的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镜像,所以我不想在那里使用CloudWatch日志。

还有其他方法吗?

4个回答

2
在您的任务定义中,将日志配置指定为以下内容:
"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


我们如何从ECS收集JVM指标,包括GC日志,并将其发送到CloudWatch? - viren

1

1
你需要完成两件事情:
  1. 配置ECS任务定义,使其从容器输出中获取日志并将其导入CloudWatch日志组/流。为此,在ECS任务定义中的每个ContainerDefinition属性中添加LogConfiguration属性。你可以在这里看到文档hereherehere
  2. 不要将日志写入容器中的文件,而是将它们写入/dev/stdio/dev/stdout//dev/stderr。你只需在Apache配置中使用这些路径,就可以看到Apache日志消息输出到容器的日志中。

1
第二个问题是,所有文件的日志将会合并成一个流,而我希望来自10个文件的日志能够分别写入不同的文件。 - Mirage
@Mirage 可能不是你想听到的,但根据我的经验,这并不是一个真正的问题。你可以使用awslogs (https://github.com/jorgebastida/awslogs)从日志组中获取日志。另外,你可以更改日志格式以包括主机名(请参见http://httpd.apache.org/docs/current/mod/mod_log_config.html),这样过滤特定主机的流量会更容易。我不知道任何处理日志的方法符合你的要求。 - John Nicely

0

根据您定义的用例:

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

在之前的答案中,您已经看到了awslog将stdout作为日志记录机制。此外,已经说明了awslog是针对每个容器应用的,这意味着每个正在运行的容器都有一个aws云日志流。

当您切换到所有日志的stdout以实现目标时,这并不是您的选择:

  • 您可以应用一个单独的容器作为日志记录机制(请记住每个容器有一个日志流),用于主容器
  • 这会导致一个单独的容器,它应用awslogs驱动程序,并按顺序(也可以异步)从其他容器中读取文件,并将它们推送到您选择的单独的aws云日志流中
  • 这样,您就可以为每个文件拥有单独的日志流或组(如果您喜欢)

先决条件:

  1. 主容器和一个具有访问主容器卷或主机的单独日志记录容器

查看此问题,了解如何通过Docker Compose在多个容器之间共享卷: Docker Compose - Share named volume between multiple containers

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

这里有一个链接,可以了解如何使记录容器与主机docker守护程序通信 https://itnext.io/docker-in-docker-521958d34efd

  1. 使用以下Dockerfile创建日志记录docker容器:

    FROM ubuntu
    ...
    ENTRYPOINT ["cat"]
    CMD ["loggingfile.txt"]

  2. 您可以将此容器应用为带有输入参数logging_file_name的函数,以便将其写入stdout并直接进入aws Cloudwatch:

    docker run -it --log-driver=awslogs
    --log-opt awslogs-region= region
    --log-opt awslogs-group= 您定义的组名
    --log-opt awslogs-stream= 您定义的流名称
    --log-opt awslogs-create-group=true
    <Logging_Docker_Image> <logging_file_name>


enter image description here

通过这种设置,您可以拥有单独的Docker日志记录容器,该容器与Docker主机通信并启动另一个Docker容器以读取主容器的日志文件,并将其完全按您自己的方式推送到AWS Cloudwatch。


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