Ruby on rails 为什么Elastic Beanstalk在部署时删除应用程序日志

Ruby on rails 为什么Elastic Beanstalk在部署时删除应用程序日志,ruby-on-rails,linux,amazon-web-services,amazon-elastic-beanstalk,Ruby On Rails,Linux,Amazon Web Services,Amazon Elastic Beanstalk,我们使用Rails应用程序运行Elastic Beanstalk(64位Amazon Linux 2016.09 v2.3.1,运行Ruby 2.3(Puma)) 应用程序日志正在写入与标准类似的/var/apps/current/log/production.rb。作为EB的标准配置,该文件被符号链接到/var/apps/containerfiles/logs/,用于循环和上传到S3 出于某种原因,production.log似乎在我们每次部署eb时都会被覆盖或截断,这似乎是无意的 我们是否对

我们使用Rails应用程序运行Elastic Beanstalk(64位Amazon Linux 2016.09 v2.3.1,运行Ruby 2.3(Puma))

应用程序日志正在写入与标准类似的
/var/apps/current/log/production.rb。作为EB的标准配置,该文件被符号链接到
/var/apps/containerfiles/logs/
,用于循环和上传到S3

出于某种原因,
production.log
似乎在我们每次部署
eb
时都会被覆盖或截断,这似乎是无意的

我们是否对某些内容进行了错误配置,以及您建议我们如何进行调试?

我们得出了一个(可能很明显的)结论,即EB部署没有日志魔法。它只需替换
/var/apps/current/
目录,包括
/var/apps/current/log
。从而删除所有现有日志

因此,我们的解决方案是将日志放在一个单独的文件夹中,并修补EB以了解日志的放置位置。通过覆盖
app_log_dir
/var/app/containerfiles/logs/
)中的
production.log
符号链接,我们仍然依赖EB的正常程序进行轮换并发布到S3

.ebextensions/log rotation.config

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/pre/01a_override_log_symlinks.sh":
    mode: "000777"
    content: |
      #!/bin/bash
      EB_APP_LOG_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_log_dir)
      CUSTOM_APPLOG_DIR=/var/log/applog
      mkdir -p $CUSTOM_APPLOG_DIR
      chown webapp $CUSTOM_APPLOG_DIR
      chmod 777 $CUSTOM_APPLOG_DIR

      cd $EB_APP_LOG_DIR
      ln -sf $CUSTOM_APPLOG_DIR/production.log production.log
      ln -sf $CUSTOM_APPLOG_DIR/development.log development.log
/config/environments/production.rb

...
# Specific for Rails 5!
config.paths['log'] = "/var/log/applog/#{Rails.env}.log"
...
我们得出了一个(也许是显而易见的)结论,即EB部署没有日志魔法。它只需替换
/var/apps/current/
目录,包括
/var/apps/current/log
。从而删除所有现有日志

因此,我们的解决方案是将日志放在一个单独的文件夹中,并修补EB以了解日志的放置位置。通过覆盖
app_log_dir
/var/app/containerfiles/logs/
)中的
production.log
符号链接,我们仍然依赖EB的正常程序进行轮换并发布到S3

.ebextensions/log rotation.config

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/pre/01a_override_log_symlinks.sh":
    mode: "000777"
    content: |
      #!/bin/bash
      EB_APP_LOG_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_log_dir)
      CUSTOM_APPLOG_DIR=/var/log/applog
      mkdir -p $CUSTOM_APPLOG_DIR
      chown webapp $CUSTOM_APPLOG_DIR
      chmod 777 $CUSTOM_APPLOG_DIR

      cd $EB_APP_LOG_DIR
      ln -sf $CUSTOM_APPLOG_DIR/production.log production.log
      ln -sf $CUSTOM_APPLOG_DIR/development.log development.log
/config/environments/production.rb

...
# Specific for Rails 5!
config.paths['log'] = "/var/log/applog/#{Rails.env}.log"
...

您的部署和更新策略是什么?也许EB会创建具有新版本的新实例,当部署成功时,它会删除具有以前版本的旧实例。当您进入特定的EB应用程序>配置>更新和部署时,您可以检查部署和更新策略。@nicq我们使用的是滚动部署。我们最终的解决方案是将日志放在当前文件夹之外,因为似乎所有内容都被覆盖了。我将在下面提交答案您的部署和更新策略是什么?也许EB会创建具有新版本的新实例,当部署成功时,它会删除具有以前版本的旧实例。当您进入特定的EB应用程序>配置>更新和部署时,您可以检查部署和更新策略。@nicq我们使用的是滚动部署。我们最终的解决方案是将日志放在当前文件夹之外,因为似乎所有内容都被覆盖了。我将在下面提交一个答案777的许可不是有点极端吗?0664不是更安全吗?777的许可不是有点极端吗?0664不是更安全吗?