Скрипт 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 вместо этого вызовите сценарий оболочки.
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/
2 ответа
Я бы сказал, что, скорее всего, либо rvmsudo
или же s3cmd
для успешного запуска нужны дополнительные переменные среды, которые не заданы в контексте logrotate, но находятся в сеансе интерактивной оболочки. Я не удивлюсь, если rvmsudo
недоступно в ограничительном PATH
какой набор cron.
Если вы используете серверы EC2 , кроме запуска отдельного сценария bash, можно добавить профиль экземпляра на сервер EC2, чтобы aws s3 rsync не нуждался в ключе доступа, который нельзя назначить в задании cron.
Таким образом, следующая конфигурация logrotate работает очень хорошо, если профиль экземпляра добавлен на работающий сервер EC2.
/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
}