【问题标题】:Elastic BeanStalk EC2 instance's log uses up whole disk spaceElastic BeanStalk EC2 实例的日志占用了整个磁盘空间
【发布时间】:2018-08-28 13:34:20
【问题描述】:

我有一个 Elastic BeanStalk 环境,我在其中在 1 个 EC2 实例上运行我的应用程序。我在最初配置环境时添加了负载均衡器,但从那时起我将其设置为仅使用 1 个实例。

在容器内运行的应用程序显然会产生大量日志 - 几天后它们会用完整个磁盘空间,然后应用程序崩溃。健康检查降至严重。

我看到手动终止实例会有所帮助 - 环境会删除旧实例并创建一个可以工作的新实例(直到它再次填满整个磁盘)。

我有哪些选择?定期清理日志的脚本?一些日志轮换?当磁盘快满时触发重启实例?

我自己没有写任何东西来归档 - 我的应用程序只记录到标准输出和标准错误,所以写入文件是由 EC2/EBS 包装器完成的。 (我将应用程序部署为包含 JAR、bash 脚本和 Procfile(如果相关)的 ZIP。

【问题讨论】:

    标签: amazon-web-services amazon-ec2 amazon-elastic-beanstalk


    【解决方案1】:

    对数旋转是前进的方向。您可以在 `/etc/logrotate.d/' 中创建一个配置文件,在其中声明您的选项,以避免日志文件过大。

    你可以在这里阅读更多关于配置的信息https://linuxconfig.org/setting-up-logrotate-on-redhat-linux

    示例配置文件如下所示:

    /var/log/your-large-log.log {
        missingok
        notifempty
        compress
        size 20k
        daily
        create 0600 root root
    }
    

    您还可以通过运行以下命令从 cli 测试新的配置文件:

    logrotate -d [your_config_file]
    

    这将测试日志轮换是否成功,但仅在调试模式下,因此日志文件不会实际轮换。

    【讨论】:

    • 谢谢!我的 EBS 环境似乎启用了 logrotate,所以我需要手动调查它丢失了哪些文件以及原因。
    【解决方案2】:

    默认情况下,EB 会轮换 一些 由 Docker 容器生成的日志,但不会轮换所有日志。在就这个问题联系支持后,我收到了以下有用的配置文件,放置在源路径.ebextensions/liblogrotate.config

    files:
      "/etc/logrotate.elasticbeanstalk.hourly/logrotate.elasticbeanstalk.containers.conf":
        mode: "00644"
        owner: "root"
        group: "root"
        content: |
          /var/lib/docker/containers/*/*.log {
            size 10M
            rotate 5
            missingok
            compress
            notifempty
            copytruncate
            dateext
            dateformat %s
            olddir /var/lib/docker/containers/rotated
          }
        "/etc/cron.hourly/cron.logrotate.elasticbeanstalk.containers.conf":
        mode: "00755"
        owner: "root"
        group: "root"
        content: |
          #!/bin/sh
          test -x /usr/sbin/logrotate || exit 0
          /usr/sbin/logrotate /etc/logrotate.elasticbeanstalk.hourly/logrotate.elasticbeanstalk.containers.conf
    
    container_commands:
      create_rotated_dir:
        command: mkdir -p /var/lib/docker/containers/rotated
        test: test ! -d /var/lib/docker/containers/rotated
      99_cleanup:
        command: rm /etc/cron.hourly/*.bak /etc/logrotate.elasticbeanstalk.hourly/*.bak
        ignoreErrors: true
    

    这样做是为 /var/lib/docker/containers/*/*.log 文件安装额外的日志轮换配置和 cron 任务,这些文件不会在 EB 上自动轮换。

    但是,如果主机存活的时间足够长,旋转的日志本身最终会填满磁盘。为此,您可以在 logrotation 选项列表中添加 shred(与 compress notifempty 等一起)。

    (但是,我不确定是否已将已配置为轮换的容器日志设置为切碎,可能不会 - 所以这些也可能会累积并需要修改默认的 EB 日志轮换配置。不知道如何这样做。但在大多数情况下,上述解决方案就足够了,因为主机通常不会活那么长。日志记录量和容器的生命周期可能会迫使你走得更远。)

    【讨论】:

    • 非常感谢!设置为 logrotate 后,我仍然遇到日志问题。这解释了为什么以及我能做些什么。
    • 感谢您的配置 - 希望这将成为 beanstalk 的默认行为。同时,对于任何想要使用此配置的人,请注意文件名必须以 .config 结尾,而不是 .conf(根据 docs.aws.amazon.com/elasticbeanstalk/latest/dg/…) - 所以对我来说,当命名为 .ebextensions/liblogrotate.conf 时它不起作用,但是确实以.ebextensions/liblogrotate.config 的身份工作。
    猜你喜欢
    • 2015-10-28
    • 2014-08-21
    • 2017-04-04
    • 2021-01-29
    • 2019-12-13
    • 2015-03-24
    • 1970-01-01
    • 2018-12-04
    • 2018-04-18
    相关资源
    最近更新 更多