如何禁用rails中的activerecord缓存日志记录

时间:2012-07-07 08:41:17

标签: ruby-on-rails caching activerecord logging

我正在尝试禁用生产中的缓存记录。已成功使SQL停止记录查询,但没有运气缓存日志条目。生产日志中的示例行:

CACHE (0.0ms) SELECT `merchants`.* FROM `merchants` WHERE `merchants`.`id` = 1 LIMIT 1

我不想禁用所有日志记录,因为我希望logger.debug语句显示在生产日志中。 使用rails 3.2.1与Mysql和Apache。 有什么建议吗?

3 个答案:

答案 0 :(得分:2)

我使用下面链接的帖子建议的方法使CACHE日志静音。

我用一个包装器替换了默认的ActiveRecod记录器,该包装器过滤掉包含不需要的文本的消息,即“CACHE”。

首先,在config/initializers内创建一个文件,例如active_record.rb,并在文件中定义一个包装类并替换活动记录记录器,如下面的代码所示:

# Implementation of logger that ignores messages containing forbidden words
# here “CACHE” and "Settings Load"
class CacheFreeLogger < ActiveSupport::TaggedLogging

  @@excluded = ['Settings Load','CACHE']

  def add(severity, message = nil, progname = nil, &block)
    if message.nil?
      if block_given?
        message = block.call
      else
        message = progname
        progname = nil #No instance variable for this like Logger
      end
    end
    if severity > Logger::DEBUG ||  !(@@excluded.map{|e| message.include? e}.include?(true))
        @logger.add(severity, "#{tags_text}#{message}", progname)
    end
  end
end

#Replace the existing logger with the filtering one
ActiveRecord::Base.logger = CacheFreeLogger.new(ActiveRecord::Base.logger) if Rails.env.development?

原始帖子扩展了Logger而不是TaggedLoggin,但它对我不起作用。

博客中提供了此方法:http://heliom.ca/blog/posts/disable-rails-cache-logging

答案 1 :(得分:1)

Rails 5.1

# config/initializers/active_record_logger.rb

class CacheFreeLogger < ActiveSupport::Logger
  def add(severity, message = nil, progname = nil, &block)
    return true if progname&.include? "CACHE"
    super
  end
end

ActiveRecord::Base.logger = CacheFreeLogger.new(STDOUT)

答案 2 :(得分:-1)

有几个问题(thisthisthis)就像这样,所有问题都有类似主题。您可以尝试将其放入初始化文件中:

old_logger = ActiveRecord::Base.logger
ActiveRecord::Base.logger = nil

恢复记录器:

ActiveRecord::Base.logger = old_logger; nil # nil just to suppress some garbage