优化Ubuntu PHP日志存储方案
logrotate是Ubuntu系统自带的日志管理工具,可自动分割、压缩、删除旧日志,避免单个日志文件过大占用磁盘空间。配置步骤如下:
sudo apt-get install logrotatesudo nano /etc/logrotate.d/php/var/log/php-fpm/*.log {
daily # 每天轮转一次
rotate 7 # 保留最近7天的日志
compress # 压缩旧日志(节省空间)
missingok # 日志文件不存在时不报错
notifempty # 日志为空时不轮转
create 640 www-data adm # 创建新日志文件,权限640,属主www-data,属组adm
sharedscripts # 所有日志处理完再执行postrotate
postrotate
if [ -f /var/run/php-fpm/php-fpm.pid ]; then
sudo kill -USR2 `cat /var/run/php-fpm/php-fpm.pid` # 通知PHP-FPM重新打开日志文件
fi
endscript
}
sudo logrotate -f /etc/logrotate.d/php(强制立即执行)。根据环境需求设置合理的日志级别,避免记录过多无用信息(如开发环境的DEBUG日志)。
/etc/php/{version}/apache2/php.ini,CLI的/etc/php/{version}/cli/php.ini):error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT # 仅报告错误和警告,排除通知和严格模式提示
log_errors = On # 启用错误日志记录
error_log = /var/log/php_errors.log # 指定日志文件路径(需确保目录可写)
display_errors = Off # 生产环境关闭浏览器显示错误(防止敏感信息泄露)
sudo systemctl restart apache2(Apache)或sudo systemctl restart nginx(Nginx)。同步日志记录会阻塞应用程序进程,增加响应延迟。推荐使用Monolog库实现异步日志:
composer require monolog/monologuse Monolog\Logger;
use Monolog\Handler\RotatingFileHandler;
use Monolog\Handler\AsyncHandler;
use Monolog\Processor\PsrLogMessageProcessor;
$log = new Logger('app');
// 异步处理器(队列大小可根据服务器性能调整)
$asyncHandler = new AsyncHandler(new RotatingFileHandler('/var/log/app_async.log', 7));
$log->pushHandler($asyncHandler);
$log->pushProcessor(new PsrLogMessageProcessor()); // 格式化日志消息
$log->error('This is an asynchronous error log.');
日志文件的频繁写入会对磁盘造成较大压力,建议将日志存储在高性能存储设备上:
/dev/sdb1挂载到/var/log/php),避免日志写入影响系统分区(如/或/home)的性能;即使启用了logrotate,仍需定期检查日志存储情况,清理过期或异常增长的日志:
/etc/crontab):0 2 * * * root find /var/log/php_*.log.* -mtime +30 -exec rm -f {} \; # 每天凌晨2点执行
rm命令(需root权限):sudo rm /var/log/php_old.log。通过监控工具实时跟踪日志文件的大小、数量和写入频率,及时发现异常(如日志暴增):
df -h /var/log(查看日志分区磁盘使用率)、du -sh /var/log/php*.log(查看单个日志文件大小);生产环境中,关闭对调试信息、通知等非必要日志的记录:
error_log(E_NOTICE, ...)或error_log(E_STRICT, ...);.env文件中设置APP_LOG_LEVEL=warning)。对于分布式系统或多台服务器,建议使用外部日志管理工具(如Fluentd、Logstash、Graylog)收集、存储和分析日志: