0

Tailing log file với Capistrano 3

Khi nói đến Capistrano thì các bạn thường hay nghĩ đến việc deploy code lên server nhưng Capistrano có thể làm được nhiều hơn thế, sau đây là một ví dụ.

Thông thường để tail log file trên server production hoặc staging thì bạn cần ssh lên server nhưng đôi khi bạn sẽ thấy điều đó thật bất tiện, hôm nay chúng ta sẽ tìm hiểu để làm điều đó ngay trên máy local bằng cách sử dụng Capistrano.

Với Capistrano 2, đoạn mã của bạn sẽ trông như sau:

	namespace :logs do
	  desc "tail rails logs"
	  task :tail_rails, roles: :app do
		trap("INT") { puts 'Interupted'; exit 0; }
		run "tail -f #{shared_path}/log/#{rails_env}.log" do |channel, stream, data|
		  puts "#{channel[:host]}: #{data}"
		  break if stream == :err    
		end
	  end
	end

Với Capistrano 3, nó thậm chí còn đơn giản hơn:

namespace :logs do
  desc "tail rails logs"
  task :tail_rails do
    on roles(:app) do
      execute "tail -f #{shared_path}/log/#{fetch(:rails_env)}.log"
    end
  end
end

Đoạn mà này nên được để trong lib/capistrano/tasks/logs.cap và có thể thực thì với lệnh:

cap production logs:tail_rails

và có thể dừng lại bằng Ctrl + C.

Với cách trên thì rails log trên tất cả các host được định nghĩa trong role :app sẽ được tail. Bạn có thể add thêm các task các để theo dõi các file log khác mà bạn muốn ví dụ như unicorn. Hoặc bạn có thể thay đổi code 1 chút cho mọi thứ trở lên linh hoạt hơn. Ví dụ như:

namespace :logs do
  task :tail, :file do |t, args|
    if args[:file]
      on roles(:app) do
        execute "tail -f #{shared_path}/log/#{args[:file]}.log"
      end
    else
      puts "please specify a logfile e.g: 'rake logs:tail[logfile]"
      puts "will tail 'shared_path/log/logfile.log'"
      puts "remember if you use zsh you'll need to format it as:"
      puts "rake 'logs:tail[logfile]' (single quotes)"
    end
  end
end

Một trong các ưu điểm của Capistrano rake task là bạn có thể truyền các tham số vào bất kỳ task nào mà bạn muốn, vói task trên thì để tail rails_app_path/shared/log/production.log bạn có thể làm:

rake logs:tail[production]

với file rails_app_path/shared/log/unicorn.log

rake logs:tail[unicorn]

Nếu bạn sử dụng ZSH thì khi bạn dùng các truyền tham số vào rake task bạn có thể gặp lỗi sau:

zsh: no matches found: logs:tail[production]

để khác phục lỗi này bạn có thể đặt task vào trong ngoặc kép như sau:

rake 'logs:tail[production]'

Tài liệu tham khảo

  1. http://www.talkingquickly.co.uk/2013/12/tailing-log-files-with-capistrano-3/

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí