在 CentOS 上,PHP 本身不会自动按天分割日志,通常需要借助 Web 服务器(Nginx / Apache) 或 logrotate 来实现。下面按常见场景说明。
修改 php-fpm.conf 或 www.conf:
php_admin_value[error_log] = /var/log/php/php_errors_%Y%m%d.log
⚠️ 注意:PHP 原生
error_log不支持日期变量 ✅ PHP-FPM 的php_admin_value[error_value]支持%Y%m%d
然后创建目录:
mkdir -p /var/log/php
chown -R www-data:www-data /var/log/php
每天 PHP-FPM 会自动生成:
php_errors_20260121.log
在 nginx.conf 或虚拟主机:
access_log /var/log/nginx/access_%Y%m%d.log;
error_log /var/log/nginx/error.log;
Nginx 原生支持时间变量 ✅
Apache 不支持日期变量,但可以用 rotatelogs:
CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/access_%Y%m%d.log 86400" combined
ErrorLog "|/usr/sbin/rotatelogs /var/log/httpd/error_%Y%m%d.log 86400"
如果你现在是:
error_log = /var/log/php/php_errors.log
vi /etc/logrotate.d/php
内容:
/var/log/php/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0644 www-data www-data
sharedscripts
postrotate
systemctl reload php-fpm > /dev/null 2>&1 || true
endscript
}
logrotate -d /etc/logrotate.d/php # 调试
logrotate -f /etc/logrotate.d/php # 强制执行
如果是自己写的日志(如 file_put_contents):
$logFile = '/var/log/app/' . date('Y-m-d') . '.log';
file_put_contents($logFile, $msg, FILE_APPEND);
| 方案 | 是否推荐 | 说明 |
|---|---|---|
| PHP-FPM 日期日志 | ⭐⭐⭐⭐⭐ | 最干净、无切割风险 |
| Nginx rotatelogs | ⭐⭐⭐⭐ | 稳定 |
| logrotate | ⭐⭐⭐ | 通用但需 reload |
| PHP 代码写日期 | ⭐⭐ | 适合业务日志 |
如果你能告诉我:
我可以直接给你一份可用配置。