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