1. 调整日志级别,减少不必要的日志输出
根据生产环境需求,合理设置PHP日志级别,避免记录过多无用信息(如开发阶段的DEBUG
、INFO
日志)。通过php.ini
文件修改error_reporting
参数,例如仅记录错误和警告:error_reporting = E_ERROR | E_WARNING
;或仅记录致命错误:error_reporting = E_ERROR
。同时确保log_errors = On
(开启日志记录),并指定安全的error_log
路径(如/var/log/php_errors.log
)。修改后需重启Web服务器(Apache/Nginx)或PHP-FPM使配置生效。
2. 使用异步日志记录,降低I/O阻塞
在高并发场景下,同步日志写入会成为性能瓶颈。可采用异步日志库(如Monolog)将日志写入缓冲区,后台线程处理写入操作。例如,Monolog的StreamHandler
配合BufferHandler
实现异步:
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\BufferHandler;
$log = new Logger('my_logger');
$streamHandler = new StreamHandler('/var/log/php_async.log');
$bufferHandler = new BufferHandler($streamHandler, 100); // 缓冲100条日志后批量写入
$log->pushHandler($bufferHandler);
$log->error('This is an async error log');
这种方式可显著减少磁盘I/O次数,提升应用性能。
3. 配置日志轮转,防止文件过大占用空间
使用logrotate
工具自动管理日志文件,设置轮转周期(如每天)、保留数量(如7天)、压缩旧日志(节省空间)。创建/etc/logrotate.d/php
配置文件,内容示例如下:
/var/log/php_errors.log {
daily # 每天轮转
missingok # 忽略缺失文件
rotate 7 # 保留7个旧日志
compress # 压缩旧日志(如.gz格式)
notifempty # 空日志不轮转
create 640 root adm # 新日志权限和所有者
postrotate # 轮转后重启PHP-FPM(可选)
/usr/sbin/php-fpm -k
endscript
}
配置完成后,logrotate
会按计划自动执行,无需手动干预。
4. 优化PHP-FPM日志设置,分离错误与访问日志
若使用PHP-FPM,需单独配置其日志路径和级别,避免与PHP错误日志混淆。编辑/etc/php-fpm.d/www.conf
(或对应pool配置文件),设置:
error_log = /var/log/php-fpm/error.log # 错误日志路径
access.log = /var/log/php-fpm/access.log # 访问日志路径(可选)
log_level = notice # 日志级别(建议生产环境用notice或warning)
catch_workers_output = yes # 捕获工作进程输出(便于排查worker错误)
修改后重启PHP-FPM服务:sudo systemctl restart php-fpm
。
5. 监控日志文件,及时预警异常
定期检查日志文件大小和磁盘空间,避免日志占满磁盘导致系统故障。使用df -h
查看磁盘空间,du -sh /var/log/php*.log
查看日志文件大小。进一步可使用监控工具(如Prometheus+Grafana)设置阈值报警,或通过日志分析工具(如ELK Stack、Graylog)实时监控错误日志,快速定位问题。
6. 清理过期日志,释放磁盘空间
定期删除过期日志文件,例如使用find
命令清理30天前的.log
文件:
find /var/log -type f -name "*.log" -mtime +30 -exec rm -f {} \;
或使用journalctl
清理systemd日志(如保留最近1周):
journalctl --vacuum-time=1w
建议将清理操作加入cron
定时任务(如每天凌晨执行),确保日志文件不会无限增长。