Как я могу минимизировать регистрацию запросов мониторинга? - PullRequest
2 голосов
/ 26 марта 2011

Мое приложение rails проверяется каждую минуту для проверки работоспособности, и я хочу сохранить их в журнале, если не будет ошибки. Я смог сделать это в 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

Мне удалось собрать новое решение, выполнив monkeypatching before_dispatch и after_dispatch в Rails :: Rack :: 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 __ = истина

Но все остальные запросы остаются в журнале без изменений

Но есть еще две проблемы:

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_path" не существует в Rails 3.0.5, который я использую. Я случайно скопировал мой класс из Rails 3.1.0.beta, который действительно определяет Filter_path. 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'
...

Я решил эту вторую проблему, добавив строку выше

include ActiveSupport::BufferedLogger::Severity

Я новичок в патчировании обезьян, и я не могу понять, как получить filter_path или Logger :: Error, определенные в моем патче. Я пробовал другие требования, но пока не повезло.

Мне также хотелось бы получить совет относительно надежности использования этого обезьяньего патча в моем проекте. Есть ли лучший способ сделать это?

Я знаю, что некоторые люди не верят в изменение журналов, но я не хочу, чтобы все эти команды пинга в журнале, если во время его запроса не произошла ошибка.

1 Ответ

0 голосов
/ 27 октября 2011

Возможное решение для Rails 3, где Logger заменен на Custom Logger, описано здесь: Отключение журнала Rails для каждого отдельного действия и здесь: Как отключить вход в систему Ruby on Rails для каждого действия? . Мне пришлось добавить require 'rails/all' в класс custom_logger.rb, чтобы он работал.

...