php日志轮转需确保落盘可控、自动轮转且服务不中断,分两步:先配置php.ini启用错误日志并指定绝对路径,再用logrotate每日轮转30天、权限640、usr1信号通知php-fpm重开句柄。

PHP网站日志轮转不能只靠“定期删旧文件”,关键在于让日志**落盘可控 + 轮转自动 + 服务不中断**。Apache 或 Nginx 本身不处理 PHP 运行时错误日志(如 Fatal error),这部分由 PHP 引擎独立输出,所以配置必须分两步走:先让 PHP 把错误写进指定文件,再用系统工具管理这个文件。
确保 PHP 错误日志已正确落盘
这是轮转的前提。打开你的 php.ini(路径可用 php --ini 或 phpinfo() 查看),确认以下三项已设置:
- log_errors = On:关闭则所有错误都不记录
-
error_log = /var/log/php_errors.log(或宝塔常用路径如
/www/wwwlogs/php_error.log):必须是绝对路径;目录需存在,且运行用户(如www-data、www)有写权限 - error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT:生产环境推荐,兼顾调试与去噪
改完后重启对应服务:sudo systemctl restart php-fpm(FPM 模式)或 sudo systemctl restart apache2(mod_php)或宝塔面板中点击「重载配置」。
用 logrotate 配置自动化轮转
在 /etc/logrotate.d/ 下新建配置文件,例如 php-app:
/var/log/php_errors.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 640 www-data www-data
sharedscripts
postrotate
if systemctl is-active --quiet php-fpm; then
systemctl kill --signal=USR1 php-fpm 2>/dev/null || true
fi
endscript
}
说明重点:
-
daily + rotate 30:每天轮转,最多保留 30 个归档(如
php_errors.log.1.gz到php_errors.log.30.gz) - create 640 www-data www-data:新日志文件权限严格,仅属主可读写
- postrotate 中发送 USR1:通知 PHP-FPM 重新打开日志文件句柄,避免继续往已重命名的旧文件写(mod_php 可省略,但加了无害)
验证与日常维护要点
别等 cron 自动跑,立即手动测试:
- 检查语法:
sudo logrotate -d /etc/logrotate.d/php-app(-d 是模拟运行,看是否报错) - 强制执行一次:
sudo logrotate -vf /etc/logrotate.d/php-app - 验证结果:
ls -la /var/log/php_errors*应看到原文件被清空,同时生成.1或.1.gz
补充提醒:
- 若用宝塔,日志路径通常是
/www/wwwlogs/xxx_error.log,注意把配置中的路径和用户组(常为www)同步调整 - 审计类或合规要求高的场景(如等保),建议额外加
maxage 90,与rotate共同约束——保留“最近 30 个且不超过 90 天”的日志 - 磁盘空间告警阈值建议设在 85% 以下,避免因轮转延迟导致日志写满根分区
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











