Capistrano的尾部生产日志 - 如何阻止它

时间:2011-03-07 11:06:11

标签: ruby-on-rails ruby-on-rails-3 capistrano

我在几个网站上找到了这个漂亮的代码片段,允许我通过Capistrano分析生产日志:

desc "tail production log files" 
task :tail_logs, :roles => :app do
  run "tail -f #{shared_path}/log/production.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

它工作得非常好,但是,当我读完日志时,我按下Ctrl + C并在我的控制台上产生了一个令人讨厌的错误。这不是一个大问题,但我觉得很烦人。我能做什么才能产生错误,但任务/尾部/日志查看只是静静地结束了?

另外,我对如何分析日志并不熟悉 - 这是否真的是快速查看(远程生产)日志中最新事件的最佳方式,还是有更好的方法?我知道有很多用于日志分析的工具,但我想要一个简单的解决方案来查看最后几个请求,而不是笨重而复杂的东西。我不确定这个Capistrano解决方案是否真的是最佳的。比如,大多数人使用的解决方案是什么?

5 个答案:

答案 0 :(得分:36)

请尝试trap("INT") { puts 'Interupted'; exit 0; },如下所示:

desc "tail production log files" 
task :tail_logs, :roles => :app do
  trap("INT") { puts 'Interupted'; exit 0; }
  run "tail -f #{shared_path}/log/production.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

我希望这会有所帮助。

答案 1 :(得分:3)

a blog

上很容易找到

但是这里有一些Capistrano 3的代码

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

我遇到了rails_env变量的问题,所以我只是替换了它,但是让它工作可能是值得的,所以我离开了它。

答案 2 :(得分:1)

我对Jeznet的答案做了一个小改动。如果您像我们一样在多个环境中运行capistrano-ext,您可以自动为您指定RAILS_ENV:

run "tail -f #{shared_path}/log/#{rails_env}.log" do |channel, stream, data|

答案 3 :(得分:0)

我遇到了陷阱(“INT”)部分的问题。虽然它使脚本退出而没有错误,但尾部进程仍然在远程机器上运行。如果使用此行修复它:

trap("INT") { puts 'Interupted'; run "killall -u myusername tail"; exit 0; }

不优雅,但为我工作。

答案 4 :(得分:0)

我使用gem capistrano-rails-tail-log,一切正常。 https://github.com/ayamomiji/capistrano-rails-tail-log