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定时任务(如每天凌晨执行),确保日志文件不会无限增长。