Docker中logrotate报错unknown option 'I'无法轮转日志如何解决
问题根因
- 手动测试命令用法完全错误:
logrotate命令的入参是配置文件路径,不是待轮转的日志路径。你执行logrotate -d /myapp/log/production.log时,程序直接把Rails日志文件当配置文件逐行解析,读到每行开头的I字符自然报unknown option 'I'的错误,这个报错和日志内容、logrotate配置本身没有任何关系。 - Docker容器默认不启动cron定时服务:logrotate本身没有常驻进程,完全依赖系统cron定时触发执行,你只放置了配置文件但没有运行调度logrotate的进程,自然不会自动完成轮转。
修复步骤
用正确命令验证配置有效性
你写的logrotate配置规则本身没有问题:Rails日志块内的daily/rotate7配置优先级高于全局的weekly/rotate1规则,copytruncate参数也适配Rails进程持续持有日志文件句柄的场景,不需要重启进程就能完成轮转。测试时不要传日志路径,正确的调试命令为:# 加载主配置文件做空跑调试,不会实际执行轮转操作 logrotate -d /etc/logrotate.conf确认空跑没有配置报错后,可以执行强制轮转验证效果:
# 强制执行一次轮转,忽略周期判断逻辑 logrotate -f /etc/logrotate.conf执行后查看
/myapp/log目录,若出现production.log.1(受delaycompress参数影响,首次轮转不会立刻压缩)、原production.log文件大小被截断,说明配置本身可以正常工作。补全容器内的定时调度能力
要实现自动按天轮转,需要在容器内启动cron服务,保证系统每天定时触发logrotate:- 先确认镜像内安装了必要组件:精简基础镜像默认不带cron和logrotate,Alpine镜像执行
apk add --no-cache logrotate cron tzdata安装,Debian/Ubuntu基础镜像执行apt-get update && apt-get install -y --no-install-recommends logrotate cron安装。 - 修改容器启动脚本,在启动Rails服务前先启动cron后台进程,避免cron随启动脚本退出异常终止:
# Alpine镜像启动cron的命令 /usr/sbin/crond -b # Debian/Ubuntu镜像启动cron的命令 # service cron start # 后面跟原有Rails启动命令,比如puma/unicorn启动指令 # bundle exec puma -C config/puma.rb - 确认cron的定时任务配置正常:通过包管理器安装logrotate时,一般会自动在
/etc/cron.daily/目录下放置可执行的logrotate脚本,每天会自动触发一次;如果没有该脚本,手动给root用户加一条crontab规则即可:0 0 * * * /usr/sbin/logrotate /etc/logrotate.conf
- 先确认镜像内安装了必要组件:精简基础镜像默认不带cron和logrotate,Alpine镜像执行
可选校验项
确认logrotate的状态文件(默认路径为/var/lib/logrotate/status)有正常写入权限,logrotate靠这个文件记录每个日志的上次轮转时间,用来判断是否到达轮转周期,root用户运行默认不会有权限问题,手动执行一次轮转后查看文件内是否有对应日志的轮转时间记录即可。
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

