Вимкнути введення конфігурації протоколу SQL в Rails


262

Чи є спосіб відключити реєстрацію запитів SQL під час виконання команд у консолі? В ідеалі було б чудово, якби я міг просто відключити його і знову включити його за допомогою команди в консолі.

Я намагаюся щось налагодити і за допомогою "ставить" для друку деяких релевантних даних. Однак вихід запиту 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, але не пощастило.
samvermette

5
ви можете помістити цей код .irbrc, який в основному .bashrcпризначений для консолі Rails. насправді ви можете робити що завгодно , в , .irbrcякщо ви хочете, наприклад, підсвічування синтаксису, історії, редагування коду в VI , а потім запустити його в консолі Rails і т.д. , перевірте мій дорогоцінний камінь , utility_beltякщо ви на Ruby 1.8 або порт Ruby 1.9 називаєтьсяflyrb
Giles Bowkett

2
@giles bowkett: Насправді .irbrcце як, .bashrcале насправді для вашого рубінового інтерактивного командного рядка. Це не річ. Я думаю, що ви, ймовірно, отримаєте помилки, якби ви спробували посилатися на класи рейок, коли ви працювали з IRB поза середовищем рейки.
eremzeit

9
@samvermette Ви можете це зробити у конфігураційному файлі. Наприклад:config/initializers/activerecord_logger.rb
Урі

15
ActiveRecord::Base.logger.level = 1набагато краща відповідь, оскільки вона не спричинить винятків, якщо ви використовуєте .info та інші.
Брудний Генрі

72

Ось варіант, який я вважаю дещо більш чистим, який все ще дозволяє потенційному іншому ведення журналу від AR. У config / environment / 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, ви зробили щось інше, щоб налаштувати свій стек Rail init, або ви забули config.after_initialize?
jrochkind

1
Чудово працює в моєму додатку Rails 3.1. Здається, найприємніше рішення. +1
Martijn

Не працює для мене ... встановлює рівень ОК у блоці після_ініціалізації, але рівень повертається до 0 до моменту відкриття консолі. Дивно. (Я використовую Pry в якості заміни консолі, це чому?)
Майк Блайт

63

Це може бути не підходящим рішенням для консолі, але у Rails є метод для цієї проблеми: Logger # silent

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

4
Працюватиме лише до Рейки 3: "ПЕРЕДАЧА ЗАПЕРЕДЖЕННЯ: мовчання застаріле і буде видалено з рейок 4.0"
Кангур

6
@Kangur Я на рейках 4.2 і тиша, здається, спрацює нормально
Бенджамін Крузьє

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

6
Працює в Rails 5, і я не бачу попереджень. Це найкраща відповідь ІМО.
Перевантаження119

1
Добре працює в Rails 6. Можливо, його просто перенесли трохи?
johncip

16

Для Rails 4 ви можете помістити в файл середовища таке:

# /config/environments/development.rb

config.active_record.logger = nil

Це вступить в силу лише у виробництві, де лісозаготівля все-таки пригнічена ....
Роб

13

У випадку, якщо хтось хоче фактично вибити журнал операторів 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

Хороший. Це працює на реєстрації в SQL, не впливаючи на Rails.logger.debugоператори.
Teemu Leisti

Тут загальна сума. Де саме ми повинні це поставити?
девіус

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

8

Я використав це: config.log_level = :info редагуванняconfig/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.