1. 配置合理的PHP日志级别
根据环境调整PHP错误报告级别,生产环境建议关闭不必要的通知(如E_NOTICE、E_STRICT),仅记录错误(E_ERROR)、警告(E_WARNING)和解析错误(E_PARSE),避免日志冗余。同时,生产环境必须关闭display_errors(设为Off),防止敏感信息(如数据库凭证、代码片段)泄露给终端用户。示例配置(php.ini):
error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log
2. 分离PHP-FPM与Web服务器日志
若使用PHP-FPM(推荐架构),需单独配置PHP-FPM的访问日志(access_log)和错误日志(error_log),与Web服务器(Apache/Nginx)日志分离。这有助于快速定位PHP进程问题(如超时、内存溢出)和Web服务器问题(如请求处理延迟)。示例配置(/etc/php-fpm.d/www.conf):
access_log = /var/log/php-fpm/www-access.log
error_log = /var/log/php-fpm/www-error.log
重启PHP-FPM使配置生效:sudo systemctl restart php-fpm。
3. 使用logrotate实现日志自动轮转
通过logrotate工具自动管理日志文件,避免单个日志文件过大占用磁盘空间。创建/etc/logrotate.d/php配置文件,设置每日轮转、保留7天、压缩旧日志,并在轮转后重启PHP-FPM以重新打开日志文件。示例配置:
/var/log/php_errors.log /var/log/php-fpm/*.log {
daily
missingok
rotate 7
compress
notifempty
create 0640 root adm
sharedscripts
postrotate
systemctl restart php-fpm >/dev/null 2>&1 || true
endscript
}
测试配置有效性:sudo logrotate -f /etc/logrotate.d/php。
4. 异步日志记录优化性能
高并发环境下,同步日志记录(如直接写入文件)可能成为性能瓶颈。推荐使用Monolog等第三方库实现异步日志记录,将日志写入内存队列(如Redis、RabbitMQ),由后台进程异步处理,减少对PHP进程的阻塞。示例代码(使用Monolog):
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\RotatingFileHandler;
$log = new Logger('php_app');
$log->pushHandler(new RotatingFileHandler('/var/log/php_async.log', 7, Logger::ERROR));
$log->error('This is an async error log.');
5. 集中式日志管理(可选但推荐)
对于分布式系统或多服务器环境,使用ELK Stack(Elasticsearch+Logstash+Kibana)或Graylog收集、存储和分析PHP日志。通过集中式管理,可实现日志的统一查询、可视化和告警(如实时监控错误率上升),提升运维效率。需配置PHP日志输出到syslog(php.ini中设置error_log = syslog),再通过rsyslog转发到Logstash。
6. 定期监控与清理日志
df -h命令定期检查/var/log分区使用情况,避免日志占满磁盘导致系统崩溃。cron任务定期删除超过7天的日志文件(如find /var/log/php* -type f -name "*.log" -mtime +7 -exec rm -f {} \;),或结合logrotate的maxage参数自动清理。7. 权限与安全性管理
确保日志文件的权限设置合理,防止未授权访问。通常,日志文件属主为root,属组为adm或www-data(Web服务器用户),权限设为640(-rw-r-----)。示例命令:
sudo chown root:adm /var/log/php_errors.log
sudo chmod 640 /var/log/php_errors.log
定期检查日志内容,排查异常活动(如频繁的数据库连接失败、非法访问尝试)。