Подтвердить что ты не робот

Как отключить ведение журнала в Ruby on Rails для каждого действия?

У меня есть приложение Rails, которое имеет действие, которое вызывается достаточно часто, чтобы быть неудобным, когда я разрабатываю, поскольку это приводит к большому количеству дополнительных выходных данных журнала, которые мне не нужны. Как я могу заставить рельсы не регистрировать ничего (контроллер, действие, параметры, время доработки и т.д.) Только для одного действия? Я хотел бы также условно настроить его на RAILS_ENV, поэтому журналы в процессе производства завершены.

Спасибо!

4b9b3361

Ответ 1

Ответ оказывается намного сложнее, чем я ожидал, поскольку рельсы на самом деле не делают никаких попыток сделать это. Вместо этого вам нужно обернуть некоторые из кистей 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

Ответ 3

Вы можете отключить объект журнала Rails:

def action
  Rails.logger.silence do
    # Things within this block will not be logged...
  end
end

Ответ 4

Ниже приведено как минимум Rails 3.1.0:

Создайте собственный журнал, который можно отключить:

# selective_logger.rb
class SelectiveLogger < Rails::Rack::Logger

  def initialize  app, opts = {}
    @app = app
    @opts = opts
    @opts[:silenced] ||= []
  end

  def call  env
    if @opts[:silenced].include?(env['PATH_INFO']) || @opts[:silenced].any? {|silencer| silencer.is_a?( Regexp) && silencer.match( env['PATH_INFO']) }
      Rails.logger.silence do
        @app.call env
      end
    else
      super env
    end                        
  end

end

Скажите Rails, чтобы использовать его:

# application.rb
config.middleware.swap Rails::Rack::Logger, SelectiveLogger, :silenced => ["/remote/every_minute", %r"^/assets/"]

В приведенном выше примере показано, как отключить запросы обслуживания ресурсов, которые в среде разработки требуют меньше (а иногда и нет) прокрутки назад для просмотра фактического запроса.

Ответ 5

Используйте самоцвет lograge.

Gemfile:

gem 'lograge'

конфиг /application.rb:

config.lograge.enabled = true
config.lograge.ignore_actions = ['StatusController#nginx', ...]

Ответ 6

Вы можете добавить драгоценный камень к глушителю Gemfile.

gem 'silencer', '>= 1.0.1'

И в вашем config/initializers/silencer.rb:

  require 'silencer/logger'

  Rails.application.configure do
    config.middleware.swap Rails::Rack::Logger, Silencer::Logger, silence: ['/api/notifications']
  end

Ответ 7

Следующее работает с Rails 2.3.14:

Создайте собственный журнал, который можно отключить:

#selective_logger.rb  
require "active_support"

class SelectiveLogger < ActiveSupport::BufferedLogger

  attr_accessor :silent

  def initialize path_to_log_file
    super path_to_log_file
  end

  def add severity, message = nil, progname = nil, &block
    super unless @silent
  end
end

Скажите Rails, чтобы использовать его:

#environment.rb
  config.logger = SelectiveLogger.new  config.log_path

Перехватить вывод журнала в начале каждого действия и (повторно) настроить регистратор в зависимости от того, должно ли действие быть тихим или нет:

#application_controller.rb
  # This method is invoked in order to log the lines that begin "Processing..."
  # for each new request.
  def log_processing
    logger.silent = %w"ping time_zone_table".include? params[:action]
    super
  end

Ответ 8

Возможно, вам действительно нужно просто отфильтровать файл журнала перед его просмотром? Вы можете запустить его через sed или awk?

Вероятно, это плохая идея скрыть вещи из журнала разработки.