我有一个Elastic BeanStalk环境,我在1 EC2实例上运行我的应用程序。我最初配置环境时添加了负载均衡器,但从那时起我只设置了1个实例。
在容器内运行的应用程序显然会产生大量日志 - 几天后它们耗尽整个磁盘空间然后应用程序崩溃。健康检查严重。
我看到终止实例手动帮助 - 环境删除旧实例并创建一个有效的新实例(直到它再次填满整个磁盘)。
我有什么选择?一个定期清理日志的脚本?有些日志轮换?当磁盘快满时触发重新启动实例?
我没有写任何文件来自己 - 我的应用程序只登录std out和std err,所以写入文件由EC2 / EBS包装器完成。 (我将应用程序部署为包含JAR,bash脚本和Procfile
的ZIP,如果相关的话)。
答案 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选项列表中添加shred
(compress
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]
这将测试日志轮换是否成功但仅在调试模式下,因此日志文件实际上不会旋转。