在我的rails应用程序中,我有一个后台进程运行器,模型名称为Worker,用于检查每10秒运行的新任务。此检查每次都会生成两个SQL查询 - 一个查找新的作业,一个删除旧的完成的查询。rails中特定于模型的SQL日志记录
与此问题 - 主日志文件获取垃圾邮件的每个查询。
我可以将Worker模型衍生的SQL查询引导到单独的日志文件中,或者至少将它们静默?覆盖Worker.logger不起作用 - 它只重定向显式调用logger.debug(“something”)的消息。
在我的rails应用程序中,我有一个后台进程运行器,模型名称为Worker,用于检查每10秒运行的新任务。此检查每次都会生成两个SQL查询 - 一个查找新的作业,一个删除旧的完成的查询。rails中特定于模型的SQL日志记录
与此问题 - 主日志文件获取垃圾邮件的每个查询。
我可以将Worker模型衍生的SQL查询引导到单独的日志文件中,或者至少将它们静默?覆盖Worker.logger不起作用 - 它只重定向显式调用logger.debug(“something”)的消息。
查询在适配器级别记录,正如我在这里演示的。 How do I get the last SQL query performed by ActiveRecord in Ruby on Rails?
你不能改变行为,除非用一些真正可怕的黑客来调整适配器行为。
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实例。
终于实现了这一点。不是我所希望的,但它确实解决了这个问题。 – 2009-07-27 10:03:11