Apache日志轮转后权限丢失,本质是logrotate未通过create指令正确设置新日志文件的权限、属主和属组;需检查配置中create行是否完整(如create 640 www-data www-data),验证实际文件属性,排除SELinux或systemd干扰,并调试确认轮转真正生效。

Apache 日志轮转后权限丢失,本质是 logrotate 创建新日志文件时未正确设置属主、属组或权限,导致 Apache 进程(如 www-data 或 apache)无法写入。排查需聚焦配置项与执行结果两个层面。
检查 logrotate 配置中 create 指令是否完整
logrotate 默认不会自动创建新日志文件;若未显式声明 create,轮转后空文件不存在,Apache 写日志会失败(Permission denied 或 silently drop logs)。关键要确认三项:
- 是否存在
create行,且包含权限、用户、组三要素,例如:create 640 www-data www-data - 用户和组名必须与 Apache 实际运行身份一致(可通过
ps aux | grep apache或grep -i "user\|group" /etc/apache2/apache2.conf确认) - 权限值(如 640)需允许 Apache 用户有写权限(第二位为 4 表示组可读,但组必须含 Apache 用户;若用 600,则仅属主可写,属组权限无效)
验证轮转后新日志文件的实际属性
手动触发一次轮转(sudo logrotate -f /etc/logrotate.d/apache2),立即检查生成的新日志文件:
-
ls -l /var/log/apache2/access.log—— 确认属主、属组、权限是否匹配配置中的create值 - 若属主为 root、属组为 root,但 Apache 运行在 www-data 组下,则写入失败
- 若权限为 644 但属组无写权限,而 Apache 以组身份运行,也会拒绝写入
排除 systemd 或 SELinux 干预
某些系统启用 systemd 的日志接管或 SELinux 策略,会覆盖或限制 logrotate 的权限设置:
- 运行
ls -Z /var/log/apache2/*.log查看 SELinux 上下文;若显示异常类型(如unconfined_u:object_r:var_log_t:s0应为system_u:object_r:httpd_log_t:s0),执行sudo restorecon -Rv /var/log/apache2/ - 确认 Apache 是否由 systemd 托管且启用了
PrivateDevices=yes或ProtectSystem=strict,这类设置可能阻止日志写入;检查systemctl show apache2 | grep Protect
测试并观察轮转行为是否真正生效
logrotate 不报错不等于成功执行。建议:
- 用调试模式运行:
sudo logrotate -d /etc/logrotate.d/apache2,查看输出中是否提示 “renaming …”, “creating new …”, “running postrotate script” 等关键步骤 - 检查
/var/lib/logrotate/status中对应日志路径的最后轮转时间,确认是否更新 - 轮转后立刻访问网站,再查
tail -1 /var/log/apache2/access.log,确认是否有新记录 —— 这是最直接的写入验证


















