如何从Rails Logger中排除某个操作?

时间:2013-01-11 22:10:00

标签: ruby-on-rails

我每隔n秒进行一次ajax调用,以检查队列状态并修改我页面上的小部件进度条。当然,这会将调用转储到日志中。我想将操作的条目过滤到日志中。这可以用Logger完成吗?

实施例

class QueueCallersController < ApplicationController

   # code to stop logger from logging my_ajax_action?       

   def my_action

     # auto log this

   end

   def my_ajax_action

     #  do not log this

   end

end

3 个答案:

答案 0 :(得分:0)

嗯,我确信有很多方法可以解决这个问题,但这里有一个基于此answer的关于静默资产日志的方法。

if Rails.env.development?
  Rails.application.assets.logger = Logger.new('/dev/null')
  Rails::Rack::Logger.class_eval do
    def call_with_quiet_assets(env)
      previous_level = Rails.logger.level
      Rails.logger.level = Logger::ERROR if env['PATH_INFO'] =~ %r{^/queue_callers/my_ajax_action/} # Change the path here
      call_without_quiet_assets(env)
    ensure
      Rails.logger.level = previous_level
    end
    alias_method_chain :call, :quiet_assets
  end
end

将代码添加到config/initializers目录中的文件,然后重新启动服务器。

答案 1 :(得分:0)

您可以使用此处所述的自定义记录器:

http://dennisreimann.de/blog/silencing-the-rails-log-on-a-per-action-basis/

基本上,您将基于每个操作的自定义记录器替换默认记录器,这会使该操作的所有输出静音。您需要在其他地方指定要静音的路径。与在操作本身中添加静默代码相比,这样做的优点是更清晰,侵入性更小。

答案 2 :(得分:0)

工作解决方案基于https://github.com/rails/rails/issues/2639#issuecomment-6591735处的代码 并通过更新链接找到Ahmad Sherif的答案。

# Usage: in develoopment.rb
#
#   config.middleware.insert_before Rails::Rack::Logger, DisableAssetsLogger
#
class DisableAssetsLogger
  def initialize(app)
    @app = app
    Rails.application.assets.logger = Logger.new('/dev/null')
  end

  def call(env)
    previous_level = Rails.logger.level
    Rails.logger.level = Logger::ERROR if env['PATH_INFO'].index("/assets/") == 0
    @app.call(env)
  ensure
    Rails.logger.level = previous_level
  end
end