Capistrano task to generate Logrotate config
Motivation: your logs are growing request by request and your free disk space is smaller and smaller. Solution is log rotation with logrotate.
Requirements:
- nginx + passenger (installed in
/opt/nginx) - logrotate (
aptitude install logrotate) - capistrano (deploying into
/home/web/YOUR_APPLICATION_NAME) - logs to rotate (
production.log,access.log,error.log,newrelic_agent.log, …)
Capistrano part
Logrotate configuration will be generated from ERB template:
# logrotate.erb.conf
# Logrotate config for <%= application %>
# Generated at <%= Time.now.strftime("%d.%m.%Y, %H:%M") %>
<%= shared_path %>/log/*.log {
daily
missingok
rotate 30
compress
delaycompress
sharedscripts
olddir <%= shared_path %>/log/old
postrotate
test ! -f /opt/nginx/logs/nginx.pid || kill -USR1 `cat /opt/nginx/logs/nginx.pid`
endscript
}Notes:
- old logs moved under
olddirectory, compressed and kept for 30 days - no slow
copytruncate, after rotation of all logs in directory (sharedscripts) send USR1 signal to nginx to reopen logs
To generate logrotate configuration use following capistrano task:
# logrotate.rb Capistrano task namespace :logrotate do desc "Create logrotate configuration file" task :create_conf, :roles => :web do template = File.read(File.join(File.dirname(__FILE__), "logrotate.conf.erb")) buffer = ERB.new(template).result(binding) put buffer, "#{shared_path}/config/logrotate.conf" end end after 'setup', 'logrotate:create_conf'
Server part
To include generated configuration file add following to server’s /etc/logrotate.conf
include /home/web/YOUR_APPLICATION_NAME/shared/config/logrotate.conf
To ensure periodic rotation logrotate relies on daily execution by cron. In Debian it is placed in /etc/cron.daily/logrotate.
Resume
I have seen examples promoting virtual host generation from ERB template by capistrano tasks but why not apply it to generating logrotate configuration? You got it bundled (and versioned) with your application sources and that is big win.

