Logging

Logrotate 腳本未上傳到 s3

  • March 16, 2022

我正在嘗試使用 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/

我想說它很可能rvmsudo需要s3cmd額外的環境變數才能成功執行,這些環境變數不是在 logrotate 的上下文中設置的,而是在您的互動式 shell 會話中。如果在限制性which cron 設置rvmsudo中不可用,我不會感到驚訝。PATH

如果您正在執行 EC2 伺服器,除了執行單獨的 bash 腳本之外,還可以將實例配置文件添加到 EC2 伺服器,以便aws s3 rsync不需要無法在 cron 作業下分​​配的訪問密鑰。

因此,如果在執行的 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
}

引用自:https://serverfault.com/questions/710667