3

我每隔 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
4

3 回答 3

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
于 2013-01-12T19:02:41.207 回答
0

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

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

基本上,您可以根据每个操作将默认记录器替换为自定义记录器,从而使该操作的所有输出静音。您将需要指定要在其他地方静音的路径。与在操作本身中添加静默代码相比,这具有更清洁且侵入性更小的优点。

于 2013-01-11T23:24:19.103 回答
0

好吧,我确信有很多方法可以解决这个问题,但这里有一个基于这个关于沉默资产日志的答案的方法。

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目录中的文件中,然后重新启动服务器。

于 2013-01-11T23:19:25.253 回答