Ubuntu PHP日志轮转机制
核心机制
- 在 Ubuntu 上,PHP 的日志轮转通常由系统自带的 logrotate 统一管理,而不是 PHP 内核自带的功能。PHP-FPM 和业务应用常见日志路径包括 /var/log/php-fpm/*.log 以及 php.ini 中 error_log 指定的文件。logrotate 按日(或按大小)切割日志、压缩归档、删除过期文件,并通过通知机制让进程重新打开日志文件,避免继续写入旧文件句柄。
触发与执行方式
- 定时触发:系统通过 /etc/cron.daily/logrotate 每日由 cron 调用执行,无需单独启用 logrotate 服务;也可按需手动执行。
- 手动触发与调试:
- 语法/模拟运行:
sudo logrotate -d /etc/logrotate.conf(检查配置是否正确)
- 强制执行一次:
sudo logrotate -f /etc/logrotate.d/php-fpm(或针对具体配置)
典型配置示例
- PHP-FPM 日志轮转(/etc/logrotate.d/php-fpm)
/var/log/php-fpm/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
if [ -f /var/run/php-fpm/php-fpm.pid ]; then
kill -USR2 $(cat /var/run/php-fpm/php-fpm.pid 2>/dev/null) || true
fi
endscript
}
- PHP 错误日志轮转(/etc/logrotate.d/php-errors)
/var/log/php_errors.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0640 www-data adm
}
- 说明:FPM 使用 USR2 信号通知重新打开日志;若使用 Apache SAPI,也可在 postrotate 中执行
invoke-rc.d apache2 reload 触发重载。
关键参数与动作
- 常用指令
- daily/weekly/monthly:按天/周/月轮转
- rotate N:保留最近 N 个归档
- compress/delaycompress:压缩归档;delaycompress 常用于让最新一份暂不压缩
- missingok/notifempty:文件缺失不报错;空文件不轮转
- create MODE OWNER GROUP:轮转后重建日志文件的权限与属主
- sharedscripts:同组多个日志仅执行一次 postrotate
- postrotate/endscript:轮转后执行的命令(如通知进程重开日志)
- 进程通知动作
- PHP-FPM:发送 USR2 信号,使 FPM 重新打开日志文件
- Apache:执行服务 reload,让 PHP 模块重新打开日志句柄
排错与最佳实践
- 先确认日志路径:检查 php.ini 的 error_log、FPM 的 access/error log 配置,以及应用自身日志目录,确保 logrotate 配置路径与之匹配。
- 先用模拟再上线:
logrotate -d 检查语法与匹配规则,再用 -f 做一次真实轮转验证归档与权限是否正确。
- 权限与属主:使用 create 0640 www-data adm 等设置,确保 Web 服务对日志有写入权限。
- 信号与重载:FPM 用 USR2;Apache 用 reload,避免因句柄未切换导致日志继续写入旧文件。
- 控制日志量:结合业务将 PHP 错误报告级别调至必要范围,避免非关键日志撑大磁盘。