Elastic BeanStalk EC2实例的日志占用整个磁盘空间

时间:2018-03-19 21:03:04

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

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

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

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

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

我没有写任何文件来自己 - 我的应用程序只登录std out和std err,所以写入文件由EC2 / EBS包装器完成。 (我将应用程序部署为包含JAR,bash脚本和Procfile的ZIP,如果相关的话)。

2 个答案:

答案 0 :(得分:7)

默认情况下,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选项列表中添加shredcompress notifempty旁边等。)

(但是,我不确定已经配置为旋转的容器日志是否被设置为粉碎,可能不是 - 所以这些也可能会累积并需要修改默认的EB日志轮换配置。不确定如何做到这一点。但是大多数情况下上面的解决方案就足够了,因为主机通常不会那个长。容器的日志量和生命周期可能会迫使你走得更远。)

答案 1 :(得分:1)

Logrotation是前进的方向。您可以在`/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]

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