我有一个Rails应用程序,它的一个操作被频繁调用,这在我开发时非常不方便,因为它会导致很多我不关心的额外日志(log)输出.我怎样才能让rails不为这一个动作记录任何东西(控制器、动作、参数、完成时间等等)?我也想在RAILS_ENV上对其进行条件化,这样生产中的日志(log)就完成了.

谢谢

推荐答案

答案比我预想的要困难得多,因为rails确实没有提供实现这一点的钩子.相反,您需要包装ActionController::Base的一些精髓.在控制器的公共基类中,我

def silent?(action)
  false
end

# this knows more than I'd like about the internals of process, but
# the other options require knowing even more.  It would have been
# nice to be able to use logger.silence, but there isn't a good
# method to hook that around, due to the way benchmarking logs.

def log_processing_with_silence_logs
  if logger && silent?(action_name) then
    @old_logger_level, logger.level = logger.level, Logger::ERROR
  end

  log_processing_without_silence_logs
end

def process_with_silence_logs(request, response, method = :perform_action, *arguments)
  ret = process_without_silence_logs(request, response, method, *arguments)
  if logger && silent?(action_name) then
    logger.level = @old_logger_level
  end
  ret
end

alias_method_chain :log_processing, :silence_logs
alias_method_chain :process, :silence_logs

然后,在控制器中,使用我想要禁止登录的方法:

def silent?(action)
  RAILS_ENV == "development" && ['my_noisy_action'].include?(action)
end

Ruby-on-rails相关问答推荐

无法加载此类文件 -- mysql2/mysql2

Gem::Ext::BuildError:ERROR:无法在macOS Monterey上构建Gem本机扩展

Ruby Sinatra Web 服务在 localhost:4567 上运行,但不在 IP 上

File.open,写入和保存?

理解 Gemfile.lock:删除 Gemfile.lock 然后再次运行 bundle install 可以吗?

价格字段的字符串、小数或浮点数据类型?

什么是Ruby 用于 BESIDES 轨道?

未选中时,如何使 check_box_tag 发布false或0参数?

rails回形针和乘客`'识别'命令无法识别`

设计记住我和会话

在 Rails 生产中禁用assets资源 缩小

如何在同一个 Rails 控制器操作中处理多个 HTTP 方法

何时使用 Helpers 而不是 Partials

将 Rails 服务器绑定到 0.0.0.0 能给你带来什么?

在 Rails 协会中未找到名为的协会可能拼写错误的问题

如何创建迁移以仅在索引存在时删除索引,而不是在不存在时抛出异常?

从模型中获取验证

如何在 Rails 表单中将复选框和标签保持在同一行?

如何拆分长行的 Ruby

是否可以输出rake db:migrate产生的 SQL 更改脚本?