logrotate 配置文件需放在 /etc/logrotate.d/ 目录下(如 apache2 或 httpd)并确保文件名合法、权限为 644 且属主为 root,才能被主配置 include 加载生效。

logrotate 配置文件放哪里才生效
Apache 日志的自动切分必须靠 logrotate 读取对应配置才能触发,它不会自动扫描所有配置。系统级配置通常在 /etc/logrotate.conf,但更推荐把 Apache 相关规则单独写进 /etc/logrotate.d/apache2(Debian/Ubuntu)或 /etc/logrotate.d/httpd(RHEL/CentOS)。这个路径会被 logrotate 主配置里的 include /etc/logrotate.d 自动加载,改完不用重启服务,只要下次 cron 触发就会生效。
注意:文件名不能含点号或下划线以外的符号(比如 apache2.conf 就不会被加载),权限建议设为 644,属主是 root —— 否则 logrotate 会静默跳过。
Apache 日志路径和 postrotate 脚本怎么写
Apache 的日志路径因发行版和安装方式而异:/var/log/apache2/access.log 和 /var/log/apache2/error.log(Debian 系),或 /var/log/httpd/access_log、/var/log/httpd/error_log(RHEL 系)。配置里必须精确匹配,否则 rotate 不会执行。
postrotate 是关键:日志切分后必须通知 Apache 重新打开日志文件,否则新日志还会写进旧文件句柄。正确做法是调用 systemctl reload apache2(Debian)或 systemctl reload httpd(RHEL),而不是 restart —— reload 更轻量,不中断连接。
常见错误示例:
/var/log/apache2/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 644 www-data www-data
sharedscripts
postrotate
if systemctl is-active --quiet apache2; then
systemctl reload apache2
fi
endscript
}
为什么日志没按预期切分或压缩失效
最常踩的坑是权限和时间判断逻辑:
-
daily不代表“每天零点运行”,而是“每次运行时检查距上次 rotate 是否满 1 天”——实际触发依赖 cron(通常是/etc/cron.daily/logrotate),所以如果服务器凌晨关机,当天就不会 rotate -
compress默认用gzip,但如果系统没装gzip或 PATH 不对,压缩会失败且无提示;可加compresscmd /bin/gzip显式指定 -
create的权限要匹配 Apache worker 进程的 uid/gid(如www-data或apache),否则新日志无法写入 - 如果 Apache 是用
systemdsocket 激活的,reload可能不生效,得用kill -USR1 `cat /var/run/apache2/apache2.pid`(需确保PIDFile配置正确)
如何验证 logrotate 配置是否写对了
别等明天看效果。用 logrotate 自带调试模式立刻验证:
先模拟一次运行:logrotate -d /etc/logrotate.d/apache2(-d 是 debug,只打印动作不真实操作);再强制执行一次:logrotate -f /etc/logrotate.d/apache2(-f 强制,会真实切分+reload)。
执行后立刻检查:
– 新日志文件是否生成(如 access.log.1)
– 原 access.log 是否变为空
– ps aux | grep apache 看进程启动时间是否更新(reload 会刷新 worker 进程)
– ls -l /var/log/apache2/ 确认权限和属组是否符合 create 设置
如果 postrotate 里的 systemctl reload 报 “Failed to reload apache2.service: Unit not found”,说明服务名不对,得查 systemctl list-unit-files | grep http 确认真实 service 名。
真正难调的不是语法,而是 Apache 进程模型和 logrotate 执行上下文之间的权限与信号协同——哪怕配置全对,postrotate 脚本里少一个 sharedscripts 或多一个空格,都可能让 reload 失效,日志照旧往旧文件里写。

















