ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Отключение SQL логирования в консоли Rails: решение ошибок

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для снижения количества SQL-логов в Rails примените как уровень логирования для ActiveRecord значение ERROR:

ruby
Скопировать код
ActiveRecord::Base.logger.level = Logger::ERROR

Таким образом, логировать будут только ошибки.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Временное отключение логирования SQL

Существуют ситуации, когда нам необходимо временно отключить SQL-логирование — например, при отладке. Используйте для этого следующий блок:

ruby
Скопировать код
ActiveRecord::Base.logger.silence do
  # Выполнение указанных операций в режиме без лишнего "шума"
end

Это позволит вам без лишнего "шума" сделать нужные операции и после этого вернуться к обычному логированию.

Визуализация

Попытаемся наподобие аналогии представить себе процесс отключения логирования в консоли, как если бы мы надевали на шумную птицу наушники:

Markdown
Скопировать код
Консоль Rails: 🦜📢 -> 🦜🎧 (Вот так тишина!)
ruby
Скопировать код
# До: Логирование звучит на полную
ActiveRecord::Base.logger = Logger.new(STDOUT)

# После: Наступает тишина
ActiveRecord::Base.logger = nil

Вывод в консоль:

Markdown
Скопировать код
До: INSERT INTO `widgets` ...
После:  ...

Теперь только шёпот...

Работа в тишине

Восстанавливаем логирование простим способом

Для возврата к прежнему режиму логирования достаточно выполнить несколько простых шагов:

ruby
Скопировать код
old_logger = ActiveRecord::Base.logger # Сохраняем текущий логгер
ActiveRecord::Base.logger = nil # Отключаем логирование для процедуры выполнения операций

# Выполняем требуемые операции...

ActiveRecord::Base.logger = old_logger # Возвращаемся к логированию

Подобный подход к выключению логгера сродни действиям ниндзя.

Управляем уровнем логгера

Вы можете варьировать настройки логгера, тем самым регулируя общий уровень "шума":

ruby
Скопировать код
ActiveRecord::Base.logger.level = Logger::INFO # Или другой уровень, подходящий для задачи

С любым логгером обращаемся, как с регулятором громкости, только не звука, а логов.

Конфигурация логгера в среде разработки

В файле config/environments/development.rb вы можете воспользоваться хуком config.after_initialize для управления логированием:

ruby
Скопировать код
config.after_initialize do
  ActiveRecord::Base.logger = nil if Rails.env.development?  # И разработчикам порой нужна тишина!
end

Так, возможно, мы обретём личного дворецкого, управляющего нашими логами.

Осторожно с логгером, равным nil

Присвоение логгеру значения nil может временами привести к проблемам, когда Rails ожидает возврата логгера. Чтобы не столкнуться с предупреждениями вроде logger.warn:

ruby
Скопировать код
ActiveRecord::Base.logger = Logger.new('/dev/null')  # Так вы безопасно отправите логи в никуда

Таким образом, мы безопасно убираем в бескрайность Unix операцию логирования, исключая конфликты с Rails.

Метод невидимости для ActiveSupport::LogSubscriber

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

ruby
Скопировать код
module ActiveSupport
  class LogSubscriber
    def debug(*args, &block)
      # Мы приглушили SQL-логирование и теперь работаем в тишине
    end
  end
end

Тишина, подобная той, что в мире ниндзя.

Изолируем логгер

Если вам требуется работа с логами ActiveRecord, но при этом SQL должен оставаться тихим, склонируйте логгер:

ruby
Скопировать код
sql_silent_logger = ActiveRecord::Base.logger.clone
ActiveRecord::Base.logger.level = Logger::ERROR # Приглушаем SQL-логи
# Проводим операции...
ActiveRecord::Base.logger = sql_silent_logger # Возвращаемся к обычному режиму логов

Таким способом SQL-логи могут «вздремнуть», пока остальные будут активными.

Отключение логирования SQL в Rails 4

В Rails 4 выключение SQL-логирования осуществляется абсолютно без труда:

ruby
Скопировать код
config.active_record.logger = nil  # Этот подарок от Rails 4 мы делаем всему человечеству

Наконец то, боги SQL могут отдыхать в покое...

Полезные материалы

  1. Настройка приложений Rails — Руководства Ruby on Rails — Все варианты конфигурации Rails.
  2. logger (ActiveRecord::Base) – APIdock — Детальное руководство по управлению логированием ActiveRecord.
  3. ActiveSupport::Notifications — Полезные заметки о том, как уведомления могут влиять на процесс логирования.
  4. ActiveRecord::QueryCache — Как кэширование запросов может влиять на логирование.