Отключение SQL логирования в консоли Rails: решение ошибок
Быстрый ответ
Для снижения количества SQL-логов в Rails примените как уровень логирования для ActiveRecord значение ERROR
:
ActiveRecord::Base.logger.level = Logger::ERROR
Таким образом, логировать будут только ошибки.
Временное отключение логирования SQL
Существуют ситуации, когда нам необходимо временно отключить SQL-логирование — например, при отладке. Используйте для этого следующий блок:
ActiveRecord::Base.logger.silence do
# Выполнение указанных операций в режиме без лишнего "шума"
end
Это позволит вам без лишнего "шума" сделать нужные операции и после этого вернуться к обычному логированию.
Визуализация
Попытаемся наподобие аналогии представить себе процесс отключения логирования в консоли, как если бы мы надевали на шумную птицу наушники:
Консоль Rails: 🦜📢 -> 🦜🎧 (Вот так тишина!)
# До: Логирование звучит на полную
ActiveRecord::Base.logger = Logger.new(STDOUT)
# После: Наступает тишина
ActiveRecord::Base.logger = nil
Вывод в консоль:
До: INSERT INTO `widgets` ...
После: ...
Теперь только шёпот...
Работа в тишине
Восстанавливаем логирование простим способом
Для возврата к прежнему режиму логирования достаточно выполнить несколько простых шагов:
old_logger = ActiveRecord::Base.logger # Сохраняем текущий логгер
ActiveRecord::Base.logger = nil # Отключаем логирование для процедуры выполнения операций
# Выполняем требуемые операции...
ActiveRecord::Base.logger = old_logger # Возвращаемся к логированию
Подобный подход к выключению логгера сродни действиям ниндзя.
Управляем уровнем логгера
Вы можете варьировать настройки логгера, тем самым регулируя общий уровень "шума":
ActiveRecord::Base.logger.level = Logger::INFO # Или другой уровень, подходящий для задачи
С любым логгером обращаемся, как с регулятором громкости, только не звука, а логов.
Конфигурация логгера в среде разработки
В файле config/environments/development.rb
вы можете воспользоваться хуком config.after_initialize
для управления логированием:
config.after_initialize do
ActiveRecord::Base.logger = nil if Rails.env.development? # И разработчикам порой нужна тишина!
end
Так, возможно, мы обретём личного дворецкого, управляющего нашими логами.
Осторожно с логгером, равным nil
Присвоение логгеру значения nil
может временами привести к проблемам, когда Rails ожидает возврата логгера. Чтобы не столкнуться с предупреждениями вроде logger.warn
:
ActiveRecord::Base.logger = Logger.new('/dev/null') # Так вы безопасно отправите логи в никуда
Таким образом, мы безопасно убираем в бескрайность Unix операцию логирования, исключая конфликты с Rails.
Метод невидимости для ActiveSupport::LogSubscriber
Если вам нужно скрыть логирование, будет полезно переопределение класса ActiveSupport::LogSubscriber
:
module ActiveSupport
class LogSubscriber
def debug(*args, &block)
# Мы приглушили SQL-логирование и теперь работаем в тишине
end
end
end
Тишина, подобная той, что в мире ниндзя.
Изолируем логгер
Если вам требуется работа с логами ActiveRecord, но при этом SQL должен оставаться тихим, склонируйте логгер:
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-логирования осуществляется абсолютно без труда:
config.active_record.logger = nil # Этот подарок от Rails 4 мы делаем всему человечеству
Наконец то, боги SQL могут отдыхать в покое...
Полезные материалы
- Настройка приложений Rails — Руководства Ruby on Rails — Все варианты конфигурации Rails.
- logger (ActiveRecord::Base) – APIdock — Детальное руководство по управлению логированием ActiveRecord.
- ActiveSupport::Notifications — Полезные заметки о том, как уведомления могут влиять на процесс логирования.
- ActiveRecord::QueryCache — Как кэширование запросов может влиять на логирование.