AWS Elastic Beanstalk环境下CakePHP日志处理最佳方案及日志访问方法
我之前在维护基于CakePHP 2.10.9的Elastic Beanstalk应用时,刚好遇到过一模一样的日志访问问题,整理了几个实际好用的方案,分享给你:
方案一:重定向日志到EB默认日志目录(推荐)
Elastic Beanstalk会自动收集/var/log/目录下的日志并同步到CloudWatch Logs,把CakePHP日志写到这个目录下,就能直接在CloudWatch里查看,不用折腾额外配置。步骤如下:
- 修改CakePHP日志配置
打开项目的Config/core.php文件,找到所有Log::config的配置项,把path参数改成/var/log/cakephp/(这个目录我们后面会创建)。比如默认的错误日志配置修改后:
Log::config('default', array( 'engine' => 'File', 'path' => '/var/log/cakephp/', 'file' => 'error', 'levels' => array('notice', 'info', 'debug'), 'scopes' => false, )); Log::config('error', array( 'engine' => 'File', 'path' => '/var/log/cakephp/', 'file' => 'error', 'levels' => array('warning', 'error', 'critical', 'alert', 'emergency'), 'scopes' => false, ));
- 配置EB自动创建日志目录并设置权限
在项目根目录创建.ebextensions/01-setup-log-dir.config文件,内容如下:
container_commands: 01_create_log_dir: command: "mkdir -p /var/log/cakephp && chown apache:apache /var/log/cakephp" leader_only: false
注意:如果你的EB环境用的是Nginx,把apache:apache改成nginx:nginx。
部署应用后,CakePHP的日志就会写到/var/log/cakephp/,EB会自动把这些日志同步到CloudWatch Logs,你可以在AWS控制台的CloudWatch模块里搜索对应日志组查看,也可以用eb logs命令在本地获取日志。
方案二:用CloudWatch Logs Agent收集tmp目录日志
如果不想修改CakePHP的默认日志路径,可以通过配置CloudWatch Logs Agent来自动收集tmp/logs下的日志:
在项目根目录创建.ebextensions/02-cloudwatch-logs.config文件,内容如下:
packages: yum: awslogs: [] files: "/etc/awslogs/awscli.conf": mode: "000600" owner: root group: root content: | [plugins] cwlogs = cwlogs [default] region = `{"Ref":"AWS::Region"}` "/etc/awslogs/config/cakephp-logs.conf": mode: "000600" owner: root group: root content: | [/var/app/current/tmp/logs/error.log] log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/app/current/tmp/logs/error.log"]]}` log_stream_name = {instance_id} file = /var/app/current/tmp/logs/error.log [/var/app/current/tmp/logs/debug.log] log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/app/current/tmp/logs/debug.log"]]}` log_stream_name = {instance_id} file = /var/app/current/tmp/logs/debug.log commands: 01_restart_awslogs: command: "service awslogs restart"
部署后,CloudWatch Logs Agent会自动把tmp/logs下的error.log和debug.log推送到CloudWatch,你同样可以在控制台查看。
方案三:直接访问实例的tmp日志目录
很多人找不到EB实例中CakePHP的tmp目录,其实EB会把应用部署在/var/app/current/路径下,所以日志的完整路径是/var/app/current/tmp/logs/。你可以通过以下方式访问:
- 在EB控制台找到你的环境,点击“连接”按钮,按照提示ssh到实例;
- 执行命令进入日志目录并查看:
cd /var/app/current/tmp/logs sudo cat error.log
注意:因为EB的应用运行用户是apache/nginx,普通用户可能没有读取权限,所以需要用sudo。
额外建议:配置日志轮转
不管用哪种方案,都建议配置日志轮转,避免日志文件过大占满磁盘。创建.ebextensions/03-logrotate.config文件:
files: "/etc/logrotate.d/cakephp": mode: "000644" owner: root group: root content: | /var/log/cakephp/*.log /var/app/current/tmp/logs/*.log { daily missingok rotate 7 compress delaycompress notifempty create 640 apache apache sharedscripts postrotate service httpd reload > /dev/null 2>/dev/null || true endscript }
这个配置会每天轮转日志,保留最近7天的压缩日志,自动设置正确的权限。
内容的提问来源于stack exchange,提问作者Max90

