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


262

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

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


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

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

ActiveRecord::Base.logger.level = 1 # or Logger::INFO

since setting the logger to nil sometimes raised an errorтрепло .. Я получил этот при попытке запустить rake db:migrate stackoverflow.com/questions/1719212/...
abbood

3
Подтверждение того, что это работает в Rails 4.1.0 в инициализаторе.
Амаль Чаудхури

Ответы:


314

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

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

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

ActiveRecord::Base.logger = old_logger

1
Есть ли где-нибудь, где я могу поставить это, чтобы я отключил вывод SQL навсегда? Я попытался добавить его в envs / dev.rb, но не удача.
Самверметт

5
Вы можете вставить этот код .irbrc, который в основном предназначен .bashrcдля консоли Rails. на самом деле вы можете делать практически все, .irbrcчто угодно, например, раскраску синтаксиса, историю, редактировать код в vi, а затем выполнять его в консоли Rails и т. д. Проверьте мой гем, utility_beltесли вы используете Ruby 1.8 или порт Ruby 1.9 называетсяflyrb
Джайлс Боукетт

2
@giles bowkett: На самом деле, .irbrcэто как .bashrcдля вашей рубиновой интерактивной командной строки. Это не вещь рельсов. Я предполагаю, что вы, вероятно, получите ошибки, если попытаетесь ссылаться на классы rails, когда выполняете irb вне среды rails.
eremzeit

9
@samvermette вы можете сделать это в конфигурационном файле. Например:config/initializers/activerecord_logger.rb
Ури

15
ActiveRecord::Base.logger.level = 1это гораздо лучший ответ, так как он не вызовет исключений, если вы используете .info и другие.
Грязный Генри

72

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

config.after_initialize do
  ActiveRecord::Base.logger = Rails.logger.clone
  ActiveRecord::Base.logger.level = Logger::INFO
end

Странно, не для меня, в Rails 3.0 или 3.1. Почему ваш Rails.logger будет нулевым в блоке after_initialize, вы сделали что-то еще для настройки стека инициализации Rails или забыли config.after_initialize?
Джрочкинд

1
Прекрасно работает в моем приложении Rails 3.1. Кажется, самое хорошее решение. +1
Мартейн

У меня не работает ... устанавливает уровень ОК в блоке after_initialize, но к моменту открытия консоли уровень возвращается к 0. Странный. (Я использую Прай в качестве замены консоли, вот почему?)
Майк Блит

63

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

ActiveRecord::Base.logger.silence do
  # the stuff you want to be silenced
end

4
Будет работать только до Rails 3: «ПРЕДУПРЕЖДЕНИЕ ОБ УСТРОЙСТВЕ: тишина устарела и будет удалена из Rails 4.0»
Kangur

6
@Kangur Я на рельсах 4.2, и тишина, кажется, работает нормально
Бенджамин Крузье

2
@Kangur Я также могу подтвердить, что этот подход отлично работает на Rails 4.2
Грег Мэттью Кроссли,

6
Работает в Rails 5 и не вижу предупреждений. Это лучший ответ ИМО.
Перегрузка119

1
Прекрасно работает в Rails 6. Может быть, его немного переместили?
Джонсип

16

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

# /config/environments/development.rb

config.active_record.logger = nil

Это
Роб

13

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

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

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

Таким образом, мы можем отключить регистрацию, переписав ее так:

module ActiveSupport
  class LogSubscriber
    def debug(*args, &block)
    end
  end
end

Хороший. Это работает при ведении журнала SQL без влияния на Rails.logger.debugоператоры.
Теему Лейсти

Всего нуб здесь. Где именно мы должны положить это?
Деви

Я держу его в Lib / monkeypatch.rb и имею рельсы вытащить его с помощью следующей строки в конфиге / application.rb: Dir.glob( "./lib/*.{rb}" ).each{ | file | require file }. Имейте в виду, что обезьяноподготовка не одобряется некоторыми. Вероятно, не стоит проверять это в вашем рабочем коде.
fakeleft

8

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

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


Я на рельсах 4.1.0, и у меня все работает нормально. спасибо
Закария

4

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

module MyApp
  class Application < Rails::Application
    console do
      ActiveRecord::Base.logger = Logger.new( Rails.root.join("log", "development.log") )
    end
  end
end

2

Так же, как FYI, в Rails 2 вы можете сделать

ActiveRecord::Base.silence { <code you don't want to log goes here> }

Очевидно, фигурные скобки можно заменить do endблоком, если хотите.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.