Как отключить ведение журнала в Ruby on Rails для каждого действия?
У меня есть приложение Rails, которое имеет действие, которое вызывается достаточно часто, чтобы быть неудобным, когда я разрабатываю, поскольку это приводит к большому количеству дополнительных выходных данных журнала, которые мне не нужны. Как я могу заставить рельсы не регистрировать ничего (контроллер, действие, параметры, время доработки и т.д.) Только для одного действия? Я хотел бы также условно настроить его на RAILS_ENV, поэтому журналы в процессе производства завершены.
Спасибо!
Ответы
Ответ 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
Ответ 2
Я рассказал о том, как решить эту проблему, заменив регистратор Rails по умолчанию:
Заблокировать журнал Rails для каждого действия.
Ответ 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?
Вероятно, это плохая идея скрыть вещи из журнала разработки.