Logrotate 脚本未上传到 s3

Logrotate 脚本未上传到 s3

我尝试每天使用 logrotate 从 rails 和 nginx 命令上传一次日志文件。当我手动运行 logrotate 命令时,文件成功上传,但它从不自动上传。我尝试使用 lastaction 和 postrotate,但实际上都没有上传到 S3。我是否遗漏了一些琐碎的事情?

/home/deploy/www/mysite.com/log/*log {
su
daily
dateext
dateformat _%Y_%m_%d
rotate 3
missingok
dateext
compress
delaycompress
notifempty
copytruncate
sharedscripts
lastaction
  rvmsudo passenger-config reopen-logs;
  /usr/bin/s3cmd sync /home/deploy/www/mysite.com/log/*.gz s3://mysite_com/logs/rails/
endscript
}

编辑:下面是执行此操作的更正方法。因此,不要使用 lastaction 脚本,而是调用 shell 脚本。

lastaction
  ./rails_reload_and_upload.sh
endscript

其中包含

#/bin/bash

./reload_rails_logs.sh
/usr/bin/s3cmd --config /home/username/.s3cfg sync /home/deploy/www/mysite.com/log/*.gz s3://mysite_com/logs/rails/

答案1

我认为最有可能的是,要么rvmsudo需要s3cmd额外的环境变量才能成功运行,这些变量未在 logrotate 上下文中设置,但可以在交互式 shell 会话中设置。如果cron 设置的rvmsudo限制中没有这些变量,我不会感到惊讶PATH

答案2

如果您正在运行 EC2 服务器除了运行单独的 bash 脚本之外,还可以向 EC2 服务器添加实例配置文件,以便aws s3 rsync不需要在 cron job 下无法分配的访问密钥。

因此,如果在正在运行的 EC2 服务器上添加了实例配置文件,则以下 logrotate 配置将运行良好

/home/ubuntu//logs/*.log {
        copytruncate
        daily
        dateext
        rotate 30
        compress
        missingok
        su root root
        lastaction
                HOSTNAME=$(/bin/hostname -f)
                DD=$(/bin/date +%d)
                MM=$(/bin/date +%m)
                YYYY=$(/bin/date +%Y)
                BUCKET="s3://xxx-logs-archive/$YYYY/$MM/$DD/batch/$HOSTNAME/"
                FILE="/home/ubuntu/logs/batch.log-$YYYY$MM$DD.gz"
                /usr/local/bin/aws s3 cp "$FILE" "$BUCKET"
        endscript
}

相关内容