我通常对 logrotate 有很好的经验,但在最近在 EC2 上使用“Amazon Linux”(亚马逊部署的 CentOS 6)的安装中,logrotate 无法导致 Apache 重新打开其日志。
Apache 的 logrotate 配置与默认配置略有不同 - 由于网站流量大、对保留旧日志的要求低以及 EC2 实例存储上可用的空间小,我们每天轮换日志并且只保留 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 继续将数据传送到其中 - 占用可用空间并实际上丢失日志数据,因为无法访问。
如果我从命令行手动运行 postrotate 脚本(使用 sudo 或以 root 身份),那么 Apache 会重新打开日志,我就会得到预期的行为。
日志中没有任何有趣的内容(cron 日志显示“logrotate 已启动”后跟“logrotate 已完成”)并且系统邮件没有关于 cron 作业问题的通知。
这种情况已经持续了几个星期了(自从我们将生产服务器从基于 Debian 的安装移至基于“Amazon Linux”的安装以来),我现在完全不知道该怎么做才能找到问题所在。如能得到任何帮助,我将不胜感激。
答案1
一些建议:
logger
在 postrotate 调用之前和之后添加一行service
来确定 postrotate 部分是否被激活。我没有使用过
service
太多,但如果它有任何用于增加详细程度或记录到文件的旋钮,我会删除重定向>/dev/null
(以便实际发送详细输出!)并尝试任何可用的详细程度/记录旋钮。您提到日志没有轮换,但还有其他迹象表明 Apache 已成功重新加载吗?要确定这一点,请忽略日志轮换步骤(这样您的日志就不会被弄乱),但保留重新启动。如果 Apache 日志中没有显示尝试重新启动的某些证据,则 Apache 并未真正重新启动。相关日志行通常包括以下内容之一:
[notice] Graceful restart requested, doing restart
[notice] Apache configured -- resuming normal operations
- 我不熟悉亚马逊对 CentOS 的实现,但如果
apachectl
可用,您可以尝试暂时用 , 替换您的service
调用apachectl graceful
,看看是否有效。(我不会这样,但我会尝试这样做只是为了增加您的诊断知识)。
答案2
问题在于 Apache 的 logrotate 配置文件根本无法运行,因为其中包含 DOS 换行符 ( CR LF )。当发生这种情况时,logrotate 令人讨厌地只是跳过该文件而不在错误日志中报告任何问题。
我通过在 httpd.conf 文件上使用调试模式 () 手动运行 logrotate 发现了这一点-d
。
修复新线路即可解决问题。