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 {dailymissingokrotate 7compressnotifemptycreate 640 www-data adm# PHP-FPM默认属组为www-datasharedscriptspostrotateif [ -f /var/run/php-fpm/php-fpm.pid ]; thenkill -USR2 `cat /var/run/php-fpm/php-fpm.pid`# 通知PHP-FPM重新打开日志文件fiendscript}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 MonologLogger;use MonologHandlerRotatingFileHandler;$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.logsudo chmod 640 /var/log/php_errors.logopenssl 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')),分析性能瓶颈。