Show and tail multiple production remote logs with Capistrano
Sometimes you want to see what's happening in your production log files right now. You can use log management tools like Loggly or Papertrail for this, but there is also an easy way to stream your log files with Capistrano.
I found a basic implementation here and improved it a bit.
# config/recipes/logs.rb
namespace :logs do
desc "tail production log files"
task :tail, roles: :app do
file = fetch(:file, 'production') # uses 'production' as default
trap("INT") { puts 'Interupted'; exit 0; }
run "tail -f #{shared_path}/log/#{file}.log" do |channel, stream, data|
puts # for an extra line break before the host name
puts "#{channel[:host]}: #{data}"
break if stream == :err
end
end
end
# config/deploy.rb
load "config/recipes/logs"
The main difference is the trap("INT")
method which is used to abort the execution of the task with control + c
. Additionally, file = fetch(:file, 'production')
is used to specify the log file you want to tail in the console. fetch
checks if there is an argument provided with the -s
flag. If not, it uses a default value.
Note: Capistrano handles arguments in a specific way. You cannot check the value of file
for nil
or set it with the ||=
operator.
So how do you run the task? It's pretty easy:
# This will show and tail the production.log
$ cap logs:tail
# This will show and tail the cron.log
$ cap logs:tail -s file=cron
This is useful if you have several log files, for example a cron.log
to log your cronjobs.
Any feedback? Just ping me at @tbuehl.
This is a Nuts & Bolts Series post – join the mailing list below to get more tips & tricks.