如何在使用`rails runner`时捕获错误并将它们发送到Bugsnag?

时间:2014-01-05 15:59:55

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 bugsnag

我们在服务器上运行了几个cron任务,我们使用rails runner启动它们,如下所示:

rails runner 'MyTask.run'

其中MyTask是项目中的一个类。问题是,我们使用Bugsnag来处理任何失败的错误。当我们运行rake任务时,Bugsnag会保存错误并将其列在他们的网站中。但使用rails runner时不会发生这种情况。当发生这种情况时,如何配置rails以向Bugsnag发送错误?

1 个答案:

答案 0 :(得分:4)

Rails runner非常难以配置或自定义。这是因为它真的是一个带有this main body的脚本:

if code_or_file.nil?
  $stderr.puts "Run '#{$0} -h' for help."
  exit 1
elsif File.exist?(code_or_file)
  $0 = code_or_file
  Kernel.load code_or_file
else
  eval(code_or_file, binding, __FILE__, __LINE__)
end

正如您所看到的,它只是发送了eval代码,因此没有包装器,没有可以扩展的类,基本上没有任何东西可以配置。最好创建一个rake任务来执行与runner相同的方式,但这次是在一个由Rake控制的环境中,因此允许你配置你需要的所有东西:

desc 'Wraps a runner command with rake'
task :runner, [:command] => :environment do |t, args|
  eval(args[:command])
end

然后,您使用

调用它
rake 'runner["MyTask.run"]'

这将以与使用rails runner非常相似的方式运行任务,但是在rake(包括使用Bugsnag)的上下文中。