Ruby on rails 如何将Rails中的sql语句重定向到log/development.log之外的其他位置?
Rails中的某些东西(ActiveRecord::Base.logger?)将所有执行的SQL放入log/development.log 我有一个rails应用程序,它的数据由几个rake任务填充。通常在开发过程中,我希望运行web应用程序,并同时运行其中几个rake任务(它们是与其他系统通信并在本地数据库中创建数据的长时间运行的任务) 令人烦恼的是,它们都同时登录到同一个文件 我应该如何/在哪里更改此项?我可以从命令行执行吗?我应该在哪里做(如果在rake文件中)?还是应该为每个rake任务创建新的环境 是否有我应该阅读的文档来回答这个问题,它在哪里Ruby on rails 如何将Rails中的sql语句重定向到log/development.log之外的其他位置?,ruby-on-rails,logging,Ruby On Rails,Logging,Rails中的某些东西(ActiveRecord::Base.logger?)将所有执行的SQL放入log/development.log 我有一个rails应用程序,它的数据由几个rake任务填充。通常在开发过程中,我希望运行web应用程序,并同时运行其中几个rake任务(它们是与其他系统通信并在本地数据库中创建数据的长时间运行的任务) 令人烦恼的是,它们都同时登录到同一个文件 我应该如何/在哪里更改此项?我可以从命令行执行吗?我应该在哪里做(如果在rake文件中)?还是应该为每个rake任务
非常感谢。取决于您真正想要记录的内容。在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中的有趣事件可能是一种更干净的方法我目前的解决方案是
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
感觉有点不舒服,但也许这就是解决问题的方法。谢谢。该项目位于Rails 2.3.11上。我已经发布了我自己当前的解决方案作为可能的答案。您可以看到,
ActiveRecord::Base.logger
是一个独立于Rails.logger
的考虑因素。另外,如果我使用Rails.logger=…
而不是ActiveRecord::Base.logger=…
,我会得到NoMethodError:undefined方法'logger='for Rails:Module