logrotate无法指示Apache重新打开Amazon Linux上的日志

我对logrotate有很好的使用经验,但最近在EC2上使用“Amazon Linux”(亚马逊部署的CentOS 6)进行安装时,logrotate无法使Apache重新打开其日志。

Apache的logrotateconfiguration与默认configuration略有不同 – 由于网站stream量高,保留旧日志的最低要求以及EC2实例存储中可用的less量空间,我们每天轮换日志,只保留2天的旧文件:

# cat /etc/logrotate.d/httpd /var/log/httpd/*log { missingok notifempty sharedscripts daily rotate 2 compress postrotate /sbin/service httpd reload > /dev/null 2>/dev/null || true endscript } 

旋转本身工作正常,旧的日志被压缩。 但是,在logrotate删除旧文件后,Apache实际上并没有重新打开这些日志文件,结果旧文件并没有真正被删除,而且Apache将pipe道数据保留在这些文件中 – 耗尽了可用空间,实际上丢失了日志数据,无障碍。

如果我从命令行(使用sudo或root)手动运行postrotate脚本,Apache将重新打开日志,并获得预期的行为。

日志中没有什么有趣的东西(cron日志中写着“logrotate started”,后面跟着“logrotate finished”),系统邮件没有关于cron作业问题的通知。

这个过程已经持续了几个星期(因为我们把生产服务器从基于Debian的安装移到了基于“Amazon Linux”的安装),而现在我对于如何解决这个问题感到无能为力。 任何帮助将不胜感激。

几点build议:

  • 在postrotate service调用之前和之后添加一条logger行,以确定是否正在激活postrotate部分。

  • 我没有太多的service ,但如果它有任何增加冗长或logging到一个文件的旋钮,我会删除>/dev/nullredirect(以便实际发送详细的输出!),并尝试任何详细/logging旋钮可用。

  • 您提到日志不旋转,但有没有其他迹象表明,Apache已成功重新加载? 要确定这一点,请忽略日志轮换步骤(以便您的日志不被重复使用),但保留原位。 如果Apache日志中没有显示尝试重新启动的证据,那么Apache并没有真正重新启动。 相关的日志行通常包含如下之一:

[notice] Graceful restart requested, doing restart

[notice] Apache configured -- resuming normal operations

  • 我不熟悉亚马逊的CentOS实现,但如果apachectl可用,你可以尝试暂时用apachectl gracefulreplace你的service调用,看看是否有效。 (我不会那样离开它,但是我会试着去添加你的诊断知识)。

问题是Apache的logrotateconfiguration文件根本没有运行,因为它有DOS新行字符(CR LF)。 当发生这种情况时,logrotate恼人地跳过文件而不报告错误日志中的任何问题。

我通过在debugging模式( -d )下的httpd.conf文件上手动运行logrotate来发现此问题。

修复新的问题解决了这个问题。