Скрипт 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
}
Другие вопросы по тегам