Skip to main content
  1. Archive/

Tail Multiple Logs with Capistrano

·2 mins

Here’s a quick and easy way to tail log files from multiple hosts using Capistrano and the Foreman gem.

Capistrano Task #

First you’ll need to make sure the foreman gem is installed. This can be done globally using gem install foreman, or by adding gem 'foreman' to your Gemfile.

Next, create a new Capistrano task file called tail.rake and place it in the lib/capistrano/tasks directory; Copy & paste the following code into that file.

require 'tempfile'
namespace :tail do

  # == Tasks ==

  desc "Tail syslogs from all hosts"
  task :syslog do
    foremanize! do |foreman|
      on roles(:all) do |server|
        name          = capture("hostname").chomp.gsub(/[^0-9a-z\-]/, "_")
        command       = ssh_cmd(server, "sudo tail -f /var/log/syslog")
        foreman[name] = command
      end
    end
  end

  # == Helpers ==

  def ssh_cmd(server, command)
    "ssh %{user}@%{host} -o StrictHostKeyChecking=no %{command}" % {
      :user    => server.user,
      :host    => server.netssh_options[:host_name],
      :command => command
    }
  end

  def foremanize!
    tasks = {}
    yield(tasks)
    file = Tempfile.new("pf")
    tasks.each {|name, command| file.write("#{name}: #{command} \n") }
    file.close
    exec "foreman start --procfile=#{file.path}"
  end

end

Command & Result #

cap production tail:syslog

21:34:23 production_web_000.1    | started with pid 27053
21:34:23 production_worker_000.1 | started with pid 27054
21:34:23 production_web_001.1    | started with pid 27055
21:34:23 production_worker_000.1 | Aug 11 21:33:29 supervisord: ...
21:34:23 production_worker_000.1 | Aug 11 21:34:01 CRON[17904]: ...
21:35:02 production_web_001.1    | Aug 11 21:35:01 CRON[21946]: ...
21:35:02 production_web_000.1    | Aug 11 21:35:01 CRON[20170]: ...
21:35:03 production_web_001.1    | Aug 11 21:35:02 WEB[19793]: ...

Press CTRL+C when you’re done tailing the logs.

Environment #

This post was written for, and tested under, the following technologies…

  • Ruby (>= 1.9)
  • Capistrano (3)
  • Foreman (0.84.0)
  • Ubuntu (>= 12.04) – OS of Remote Hosts

Summary #

I’ve been using this technique since 2015 and it has made debugging issues occurring across multiple hosts a breeze. If you would like to tail other types of logs just duplicate the :syslog task and change the name and log file path.