我在几个网站上找到了这个漂亮的代码片段,允许我通过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解决方案是否真的是最佳的。比如,大多数人使用的解决方案是什么?
答案 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)
但是这里有一些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