2

私の Rails アプリは、ヘルス チェックのために毎分 ping されます。エラーが発生しない限り、これらをログから除外したいと考えています。Rails 2.3.5 では、application_controller.rb でこれを使用してロガーを設定することで、これを行うことができました。

def logger
  if params[:__no_logging__] == 'true' && params[:controller] == 'welcome'
       && params[:action] == 'index'
    # ignore monitoring requests
    RAILS_MONITOR_NULL_LOGGER
  else
    RAILS_DEFAULT_LOGGER
  end
end

しかし、これは Rails 3.0.5 では機能しません。

Rails::Rack::Dispatch で before_dispatch と after_dispatch をモンキーパッチすることで、新しいソリューションをまとめることができました。

require 'active_support/core_ext/time/conversions'
module Rails
  module Rack
    # Log the request started and flush all loggers after it.
    class Logger
      include ActiveSupport::BufferedLogger::Severity

      def before_dispatch(env)
        request = ActionDispatch::Request.new(env)

        #path = request.filtered_path
        path = request.fullpath

        if request.path == '/' && request.parameters['__no_logging__'] == 'true'
          @log_level = logger.level
            logger.level = Logger::ERROR
            #logger.level = 3
        end

        info 
         "\n\nStarted #{request.request_method} 
             \"#{path}\" " \
             "for #{request.ip} at #{Time.now.to_default_s}"
      end
      def after_dispatch(env)
        logger.level = @log_level unless @log_level.nil?
        ActiveSupport::LogSubscriber.flush_all!
      end
        end
    end
end

config/initializers/monkey_patch.rb にパッチを置きました

これは必要に応じて正確に機能します。ログにこの要求が表示されません。

http://mydomain.com?__no_logging__=true

ただし、他のすべてのリクエストは影響を受けずにログに残ります

しかし、まだ 2 つの問題があります。

1.コメントアウトする必要がありました:

path = request.filtered_path

このエラーが発生するため:

ERROR NoMethodError: undefined method `filtered_path' for #<ActionDispatch::Request:0x105b4c0e8>
/ce_development/Rails/g3/config/initializers/monkey_patches.rb:52:in `before_dispatch'
/ce_development/Rails/g3/.bundle/ruby/1.8/gems/railties-3.0.5/lib/rails/rack/logger.rb:12:in `call'
...

これで問題ないことがわかりました。問題のあるメソッド「request.filtered_pa​​th」は、私が使用している Rails 3.0.5 には存在しません。私はうっかり自分のクラスを Rails 3.1.0.beta からコピーしましたが、これはfiltered_pa​​th を定義しています。Rails 3.0.5 は、上記のように request.fullpath を使用します。

2.コメントアウトする必要がありました

logger.level = Logger::ERROR

このエラーが発生するため:

ERROR NameError: uninitialized constant Rails::Rack::Logger::ERROR
/ce_development/Rails/g3/config/initializers/monkey_patches.rb:57:in `before_dispatch'
/ce_development/Rails/g3/.bundle/ruby/1.8/gems/railties-3.0.5/lib/rails/rack/logger.rb:12:in `call'
...

上記の行を追加して、この2番目の問題を解決しました

include ActiveSupport::BufferedLogger::Severity

私はモンキーパッチを初めて使用し、パッチでfiltered_pa​​thまたはLogger::Errorを定義する方法を理解できません。他の要件を試しましたが、まだ運がありません。

また、私のプロジェクトでこのモンキー パッチを使用することの堅牢性についてもアドバイスをお願いします。これを行うより良い方法はありますか?

ログの変更を信じていない人がいることは知っていますが、リクエスト中にエラーが発生しない限り、これらすべての ping をログに記録したくありません。

4

1 に答える 1

0

ロガーがカスタム ロガーに置き換えられた場合の Rails 3 の可能な解決策については、アクションごとに Rails ログをサイレンシングする方法と、アクションごとRuby on Rails でログを無効にするにはどうすればよいですか? で説明します。. require 'rails/all'それを機能させるには、custom_logger.rbクラスに追加する必要がありました。

于 2011-10-27T13:43:14.047 に答える