在 CentOS 上分割(轮转)PHP 日志,通常做法有三种:使用 logrotate(推荐)、手动切割脚本、在 PHP-FPM 配置中处理。下面按场景详细说明。
CentOS 自带 logrotate,非常适合按天/大小分割日志。
常见位置:
# PHP-FPM 错误日志
/var/log/php-fpm/error.log
# PHP-FPM slow 日志
/var/log/php-fpm/slow.log
# Nginx + PHP 的 PHP 错误日志
/var/log/php_error.log
vim /etc/logrotate.d/php-fpm
示例配置(✅ 推荐):
/var/log/php-fpm/*.log {
daily
rotate 30
missingok
notifempty
compress
delaycompress
create 0640 www-data www-data
sharedscripts
postrotate
systemctl reload php-fpm > /dev/null 2>&1 || true
endscript
}
| 参数 | 作用 |
|---|---|
| daily | 每天分割 |
| rotate 30 | 保留 30 天 |
| compress | gzip 压缩 |
| create | 重新创建日志文件 |
| postrotate | 切割后重新加载 php-fpm(防止不写日志) |
logrotate -vf /etc/logrotate.d/php-fpm
某些 PHP-FPM 版本支持 php_admin_value[error_log] 自动切换,但不推荐,可控性差。
#!/bin/bash
LOG=/var/log/php-fpm/error.log
DATE=$(date +%Y-%m-%d)
mv $LOG $LOG-$DATE
touch $LOG
chown www-data:www-data $LOG
systemctl reload php-fpm
加入定时任务:
crontab -e
0 0 * * * /usr/local/bin/php-log-rotate.sh
否则旧日志文件句柄还在,日志不会写入新文件。
systemctl reload php-fpm
vim /etc/php-fpm.d/www.conf
重要项:
php_admin_value[error_log] = /var/log/php-fpm/error.log
php_admin_flag[log_errors] = on
| 场景 | 推荐方案 |
|---|---|
| 生产环境 | ✅ logrotate |
| 自定义时间 | logrotate + cron |
| 容器环境 | logrotate 或 stdout |
如果你愿意,可以告诉我:
php -v)我可以帮你 直接生成一份可用的 logrotate 配置。