【问题标题】:AWS ECS container logs design patternAWS ECS 容器日志设计模式
【发布时间】:2017-11-23 18:02:46
【问题描述】:

我有一个经典的 scala 应用程序,它会在该位置生成三个不同的日志

/var/log/myapp/log1/mylog.log
/var/log/myapp/log2/another.log
/var/log/myapp/log3/anotherone.log

我将应用程序容器化并且工作正常,我可以通过 docker volume mount 获取这些日志。

现在应用程序/容器将部署在具有 Auto Scaling 组的 AWS ECS 中。在这种情况下,多个容器可能会在单个 ecs 主机上运行。

我想使用 Cloud Watch 来监控我的应用程序日志。

可以将 aws log 代理放入我的应用程序容器中。

有没有更好的方法将这些应用程序日志从容器获取到 cloudwatch 日志。

非常感谢您的帮助。

【问题讨论】:

    标签: amazon-web-services docker amazon-cloudwatch amazon-ecs amazon-cloudwatchlogs


    【解决方案1】:

    使用 docker 时,推荐的方法是不记录到文件,而是将日志发送到 stdoutstderr。这样做可以防止日志被写入容器的文件系统,并且(取决于正在使用的日志驱动程序)允许您使用 docker logs / docker container logs 子命令查看日志。

    许多应用程序都有一个配置选项来登录到stdout/stderr,但如果这不是一个选项,您可以创建一个符号链接来重定向输出;比如Docker Hub上的官方NGINX镜像uses this approach

    Docker 支持日志记录驱动程序,它允许您将日志记录发送到(以及其他)AWS 云手表。在您修改映像以使其记录到 stdout/stderr 后,您可以配置 AWS 日志记录驱动程序。

    有关登录 Docker 的更多信息,请参阅"logging" section in the documentation

    【讨论】:

    • 谢谢@thaJeztah。但是我们的应用程序是遗留应用程序,它不是以 docker 方式编写的。如果我们编写新应用程序,我们可以遵循 docker 方式。现在我们必须处理遗留应用程序,那么对于我的用例来说,最好的方法是什么?
    • @KnowNothing:这个应用程序是否使用任何日志框架?如果是这样,那么您可能可以使用自定义配置文件和/或某些系统属性覆盖当前行为。其他选择是使用@thaJeztah 建议的链接方法,或者您可以尝试直接在容器中运行 CloudWatch 代理(例如,使用主管进程)或作为链接容器,中间有 rsyslog(两种变体都非常复杂 - 我'会强烈考虑链接到stdout 或框架重新配置,如果可能的话)。
    • @KnowNothing 如果您将这些文件符号链接到stdout/stderr 它应该可以工作;你试过这样做吗?
    • @thaJeztah 链接将起作用,但它将所有三个日志文件合并到一个日志流中,但我们希望 cloudwatch 中三个不同流中的三个日志文件在一个日志组下
    • 我们可以不只是在 ecs 主机中安装日志代理并进行卷挂载。我不确定如果多个容器实例在具有相同卷挂载的同一 ecs 主机中运行会发生什么?
    【解决方案2】:

    如果可以改代码,就不需要日志代理。

    您可以直接将自定义指标数据发布到 ColudWatch,就像这个页面说的:https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/examples-cloudwatch-publish-custom-metrics.html

    【讨论】:

      猜你喜欢
      • 2019-02-02
      • 1970-01-01
      • 1970-01-01
      • 2019-03-27
      • 2020-04-28
      • 1970-01-01
      • 2019-12-01
      • 2016-11-29
      • 1970-01-01
      相关资源
      最近更新 更多