Отключите Rails SQL logging в консоли

199

Есть ли способ отключить ведение журнала SQL-запросов, когда я выполняю команды в консоли? В идеале было бы здорово, если бы я мог просто отключить его и снова включить его с помощью команды в консоли.

Я пытаюсь отлаживать что-то и использовать "puts" для печати некоторых релевантных данных. Однако вывод запроса sql затрудняет чтение.


Edit: Я нашел другое решение, поскольку установка регистратора на nil иногда вызывала ошибку, если что-то, кроме моего кода, пыталось вызвать logger.warn

Вместо установки регистратора на nil вы можете установить уровень регистратора на 1.

ActiveRecord::Base.logger.level = 1 # or Logger::INFO
  • 0
    since setting the logger to nil sometimes raised an error yap .. Я получил это при попытке запустить rake db:migrate stackoverflow.com/questions/1719212/…
  • 3
    Подтверждение того, что это работает в Rails 4.1.0 в инициализаторе.
Теги:
console

7 ответов

217
Лучший ответ

Чтобы отключить его:

old_logger = ActiveRecord::Base.logger
ActiveRecord::Base.logger = nil

Чтобы включить его:

ActiveRecord::Base.logger = old_logger
  • 1
    Есть ли где-нибудь, где я могу поставить это, чтобы я отключил вывод SQL навсегда? Я попытался добавить его в envs / dev.rb, но не удача.
  • 0
    @ samvermette, ты не установил это. Просто позвоните с консоли, прежде чем выполнять свою работу.
Показать ещё 8 комментариев
56

Вот вариация, которую я считаю несколько более чистым, что все же позволяет потенциально другому каротажу от AR. В config/environment/development.rb:

config.after_initialize do
  ActiveRecord::Base.logger = Rails.logger.clone
  ActiveRecord::Base.logger.level = Logger::INFO
end
  • 0
    ошибка не может клонировать NilClass
  • 0
    Странно, не для меня, в Rails 3.0 или 3.1. Почему ваш Rails.logger будет нулевым в блоке after_initialize, вы сделали что-то еще для настройки стека инициализации Rails или забыли config.after_initialize?
Показать ещё 6 комментариев
25

Это может быть не подходящее решение для консоли, но у Rails есть метод для этой проблемы: Logger # silence

ActiveRecord::Base.logger.silence do
  # the stuff you want to be silenced
end
  • 4
    Будет работать только до Rails 3: «ПРЕДУПРЕЖДЕНИЕ ОБ УСТАРЕВАНИИ: тишина устарела и будет удалена из Rails 4.0»
  • 5
    @Kangur Я на рельсах 4.2 и тишина вроде бы работает нормально
Показать ещё 2 комментария
8

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

Линия, которая записывает в журнал (в Rails 3.2.16, во всяком случае), является вызовом debug в lib/active_record/log_subscriber.rb:50.

Этот метод отладки определяется ActiveSupport::LogSubscriber.

Итак, мы можем выбить журнал, перезаписав его так:

module ActiveSupport
  class LogSubscriber
    def debug(*args, &block)
    end
  end
end
  • 0
    Неплохо. Это работает при Rails.logger.debug журнала SQL без влияния на операторы Rails.logger.debug .
  • 0
    Всего нуб здесь. Где именно мы должны положить это?
Показать ещё 1 комментарий
5

Для Rails 4 вы можете поместить следующее в файл среды:

# /config/environments/development.rb

config.active_record.logger = nil
  • 0
    Это вступит в силу только на производстве, где в любом случае ведется заготовка леса.
  • 2
    @Rob отредактировал для 'развития', чтобы избежать путаницы.
2

Я использовал это: config.log_level = :info edit-in config/environments/performance.rb

Отлично работает для меня, отклоняя вывод SQL и показываю только рендеринг и важную информацию.

  • 0
    Я на рельсах 4.1.0, и у меня все работает нормально. Спасибо
2

В Rails 3.2 я делаю что-то вроде этого в config/environment/development.rb:

module MyApp
  class Application < Rails::Application
    console do
      ActiveRecord::Base.logger = Logger.new("#{Rails.root}/log/development.log")
    end
  end
end

Ещё вопросы

Сообщество Overcoder
Наверх
Меню