【问题标题】:Tail production log with Capistrano - how to stop itCapistrano 的尾部生产日志 - 如何停止它
【发布时间】:2011-03-07 11:06:10
【问题描述】:

我在几个网站上发现了这个漂亮的代码 sn-p,让我可以通过 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 解决方案是否真的是最优的。比如,大多数人使用的解决方案是什么?

【问题讨论】:

  • 我们使用 log.io 来跟踪我们的日志(尤其是在发布期间以观看独角兽重新加载)。不是日志分析工具,而是一次流式传输多个日志的好方法。 logio.org

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


【解决方案1】:

像这样尝试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

我希望这会有所帮助。

【讨论】:

  • 谢谢,正是我要找的东西
  • 如果在尾部开始提供数据之前中断,这将不起作用。将陷阱放在方块外面可以防止这种情况发生
【解决方案2】:

这在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 变量有问题,所以我只是替换了它,但是让它工作对你来说可能是值得的,所以我放弃了它。

【讨论】:

  • 我在使它工作时遇到了一些麻烦。该命令运行良好,但没有显示输出。有什么想法吗?
  • 检查以确保它正在查看正确的文件。您应该能够puts 相同的路径,然后通过 SSH 进入您的盒子,并确保它正在查找日志。另外,为了清楚起见,由于它是拖尾的,除非在查看时将内容添加到日志中,否则它可能不会显示任何内容。
  • 您也可以尝试硬编码日志路径,您知道它在哪里,作为故障排除的起点。
  • 输出为调试级别。因此,如果您更改为 log_level,您将看不到任何输出,例如 :info。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    trap("INT") 部分有问题。虽然它使脚本退出而没有错误,但尾部进程仍在远程机器上运行。如果用这一行修复它:

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

    不优雅,但为我工作。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2020-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多