如何将Rails中的sql语句重定向到log / development.log以外的其他语句?

时间:2011-10-03 18:33:33

标签: ruby-on-rails logging

Rails中的东西(ActiveRecord :: Base.logger?)将所有已执行的SQL放入log / development.log。

我有一个rails应用程序,其数据由几个rake任务填充。通常在开发中,我想运行Web应用程序,同时运行其中几个rake任务(它们是长时间运行的任务,与其他系统通信并在本地数据库中创建数据)。

令人讨厌的是,他们都同时登录到同一个文件。

我应该如何/在哪里更改?我可以从命令行执行此操作吗?我应该在哪里(如果在rake文件中)?或者我应该为每个rake任务创建新环境吗?

我应该阅读哪些文档来回答这个问题,它在哪里?

非常感谢。

2 个答案:

答案 0 :(得分:3)

取决于您真正想要记录的内容。在Rails 3. +中,您可以使用ActiveSupport::LogSubscriber机制挂钩到Rails内部,并将某些兴趣记录到其他文件中。

如果你真的想要为每个rake任务劫持核心Rails.logger实例,那么就是这样。

  # lib/tasks/foo.rake

  desc "Prints Hello World"
  task :helloworld do
     Rails.logger = Logger.new("/path/to/hello-world.log")
     # do something in your Rails stack that would write to "Rails.logger"
  end

未经测试,但我认为这可行。

话虽如此,我认为通过ActiveSupport::LogSubscriber订阅ActiveRecord中的有趣事件可能是一种更清洁的方法

答案 1 :(得分:1)

我目前的解决方案是

dec "update statistics"
task :update_stats => :environment do

     root_path = Rails.configuration.root_path
     env = Rails.configuration.environment
     ActiveRecord::Base.logger = Logger.new(File.join(root_path, "log", "#{env}-stats.log"))
     #code ...

end

感觉有点hacky,但也许只是这样做的方式。