优化Ubuntu PHP日志管理的实践指南
根据应用场景选择合适的日志级别,避免记录过多无用信息。例如,生产环境可设置为E_ALL & ~E_NOTICE & ~E_STRICT(记录所有错误但排除通知和严格模式提示),开发环境可保留DEBUG级别。修改php.ini文件(路径通常为/etc/php/{version}/apache2/php.ini或/etc/php/{version}/cli/php.ini),调整以下参数:
error_reporting = E_ALL & ~E_NOTICE # 仅记录错误、警告等,排除通知
display_errors = Off # 生产环境关闭浏览器显示,防止敏感信息泄露
log_errors = On # 启用日志记录
error_log = /var/log/php_errors.log # 指定统一日志文件路径
修改后重启Apache/Nginx服务使配置生效。
PHP内置日志功能有限,推荐使用Monolog库(PHP生态中最流行的日志工具),支持多处理器(Handler)、格式化(Formatter)和灵活的日志分级。通过Composer安装:
composer require monolog/monolog
在代码中配置Monolog,实现分级记录(如DEBUG写入本地文件、ERROR发送邮件)和日志分割(按大小或时间):
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\RotatingFileHandler; // 按文件大小分割
use Monolog\Handler\NativeMailerHandler; // 邮件通知
$log = new Logger('my_app');
// 文件日志:DEBUG及以上写入debug.log(保留3个文件,每个10MB)
$log->pushHandler(new RotatingFileHandler('/var/log/php/debug.log', 3, Logger::DEBUG));
// 错误日志:ERROR及以上写入error.log
$log->pushHandler(new StreamHandler('/var/log/php/error.log', Logger::ERROR));
// 关键错误:CRITICAL及以上发送邮件给管理员
$log->pushHandler(new NativeMailerHandler('admin@example.com', 'PHP Critical Error', 'error.log'));
此配置可实现日志的分类存储和及时告警。
使用Ubuntu自带的logrotate工具,避免日志文件过大占用磁盘空间。创建/etc/logrotate.d/php配置文件,添加以下规则(以PHP-FPM为例):
/var/log/php-fpm/*.log {
daily # 每天分割
missingok # 日志文件不存在时不报错
rotate 7 # 保留7天日志
compress # 压缩旧日志(节省空间)
notifempty # 日志为空时不分割
create 640 www-data adm # 新日志文件权限(属主www-data,属组adm)
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
}
测试配置是否正确:
sudo logrotate -f /etc/logrotate.d/php # 强制立即执行
logrotate会自动按配置管理日志,无需手动干预。
/mnt/logs),避免占用系统分区空间;AsyncHandler将日志写入队列,避免同步写入阻塞主线程(适用于高并发场景):use Monolog\Handler\AsyncHandler;
$syncHandler = new StreamHandler('/var/log/php/app.log', Logger::DEBUG);
$asyncHandler = new AsyncHandler($syncHandler, 10); // 队列大小10
$log->pushHandler($asyncHandler);
BufferHandler批量写入日志,减少磁盘I/O次数。640(属主可读写,属组可读),避免未授权访问:sudo chown www-data:adm /var/log/php/*.log
sudo chmod 640 /var/log/php/*.log
Processor移除敏感信息(如密码、API密钥):$log->pushProcessor(function ($record) {
$record['message'] = preg_replace('/password=[^&]*/', 'password=******', $record['message']);
return $record;
});
cron定期检查日志文件大小,超过阈值时发送告警(如通过邮件或Slack):# 每天检查日志大小,超过100MB时发送邮件
0 0 * * * find /var/log/php -type f -name "*.log" -size +100M -exec echo "Log file {} exceeds 100MB" | mail -s "PHP Log Alert" admin@example.com \;