1. 日志分类与规范化存储
将PHP日志按来源(Web服务器、PHP-FPM、应用层)分类存储,便于定位问题:
error.log(含PHP错误)、Nginx的error.log(含PHP-FPM通信错误);/var/log/php-fpm.log(进程管理错误)、www-error.log(FastCGI请求错误);LineFormatter可统一输出格式,提升可读性。2. 日志轮转配置(避免文件过大)
使用logrotate工具自动化管理日志生命周期,防止日志占满磁盘:
/etc/logrotate.d/php文件,添加以下内容(适用于PHP应用层日志):/var/log/php/*.log {
daily # 每天轮转
missingok # 文件丢失不报错
rotate 7 # 保留7天日志
compress # 压缩旧日志(节省空间)
notifempty # 空日志不轮转
create 640 root adm # 新日志权限(属主root,属组adm)
}
/etc/logrotate.d/php-fpm文件,添加以下内容(需重启PHP-FPM使新日志生效):/var/log/php-fpm/*.log {
daily
missingok
rotate 7
compress
notifempty
create 640 www-data adm # PHP-FPM默认属组为www-data
sharedscripts
postrotate
if [ -f /var/run/php-fpm/php-fpm.pid ]; then
kill -USR2 `cat /var/run/php-fpm/php-fpm.pid` # 通知PHP-FPM重新打开日志文件
fi
endscript
}
rotatelogs命令(如ErrorLog "|/usr/sbin/rotatelogs /var/log/apache2/error.log.%Y-%m-%d 86400")实现按天轮转;Nginx同理,需在postrotate中重启Nginx(kill -USR1 $(cat /var/run/nginx.pid))。3. 日志级别与敏感信息过滤
根据环境调整日志级别,避免记录无关信息:
error_reporting = E_ALL(记录所有错误,便于调试);error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT(排除通知、严格标准错误,减少噪音)。display_errors(display_errors = Off),防止敏感信息(如数据库密码、API密钥)泄露给用户,改为记录到文件(log_errors = On,error_log = /var/log/php_errors.log)。error_log前,通过preg_replace替换敏感内容(如$message = preg_replace('/password=[^&]*/', 'password=******', $message))。4. 使用成熟日志库(提升灵活性)
推荐使用Monolog库(PHP最流行的日志库),支持多种处理器(Handler)和格式化器(Formatter):
composer require monolog/monolog);use Monolog\Logger;
use Monolog\Handler\RotatingFileHandler;
$log = new Logger('app'); // 日志通道名称
$log->pushHandler(new RotatingFileHandler('/var/log/app/php_errors.log', 7, Logger::ERROR)); // 按天轮转,保留7天,仅记录ERROR及以上级别
$log->error('Database connection failed: ' . $e->getMessage()); // 记录错误信息
5. 日志安全管控(防止篡改与泄露)
root,属组设为adm或www-data(Web服务器用户),权限设为640(所有者可读写,组可读,其他用户无权限),例如:sudo chown root:adm /var/log/php_errors.log
sudo chmod 640 /var/log/php_errors.log
openssl enc -aes-256-cbc -salt -in logfile.log -out logfile.log.enc),并妥善保管密钥。grep、awk等工具分析日志(如sudo grep -i 'error' /var/log/php_errors.log),检查异常行为(如频繁的数据库连接失败、非法访问尝试)。6. 监控与报警(及时响应问题)
du -sh /var/log/php*.log定期检查日志文件大小,或通过Zabbix、Nagios等工具设置阈值报警(如日志文件超过1GB时触发报警)。ERROR级别日志数量(如grep -c 'ERROR' /var/log/php_errors.log),超过阈值(如每小时10次)时发送邮件或短信报警。$log->info('Request processed in ' . (microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']) . ' seconds')),分析性能瓶颈。