rails中特定于模型的SQL日志记录

时间:2009-07-24 11:22:20

标签: ruby-on-rails ruby logging activerecord

在我的rails应用程序中,我有一个后台进程运行器,型号名称为Worker,它检查每10秒运行一次的新任务。此检查每次生成两个SQL查询 - 一个用于查找新作业,一个用于删除旧已完成的作业。

此问题 - 主日志文件因每个查询而被垃圾邮件发送。

我可以将Worker模型生成的SQL查询指向一个单独的日志文件,或者至少使它们静音吗?覆盖Worker.logger不起作用 - 它只重定向显式调用logger.debug(“something”)的消息。

3 个答案:

答案 0 :(得分:4)

最简单,最惯用的解决方案

logger.silence do
  do_something
end

请参阅Logger#silence

答案 1 :(得分:0)

我在此处演示了如何在适配器级别记录查询。 How do I get the last SQL query performed by ActiveRecord in Ruby on Rails?

除非用一些非常可怕的黑客调整适配器行为,否则你无法改变行为。

答案 2 :(得分:0)

class Worker < ActiveRecord::Base
  def run
    old_level, self.class.logger.level = self.class.logger.level, Logger::WARN

    run_outstanding_jobs
    remove_obsolete_jobs
  ensure
    self.class.logger.level = old_level
  end
end

这是一个相当熟悉的习语。在不同的情况下,我已经多次见过它了。当然,如果你不知道ActiveRecord :: Base.logger可以像这样改变,那就很难猜到了。

此解决方案的一个警告:这会更改所有ActiveRecord,ActionController,ActionView,ActionMailer和ActiveResource 的记录器级别。这是因为所有模块共享一个Logger实例。