Deshabilitar el registro de Rails SQL en la consola


262

¿Hay alguna forma de deshabilitar el registro de consultas SQL cuando ejecuto comandos en la consola? Idealmente, sería genial si pudiera deshabilitarlo y volver a habilitarlo con un comando en la consola.

Estoy tratando de depurar algo y estoy usando "puso" para imprimir algunos datos relevantes. Sin embargo, el resultado de la consulta SQL hace que sea difícil de leer.


Editar: encontré otra solución, ya que establecer el registrador en nulo a veces generaba un error, si algo más que mi código intentaba llamar a logger.warn

En lugar de configurar el registrador nil, puede establecer el nivel del registrador en 1.

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

since setting the logger to nil sometimes raised an erroryap .. rake db:migrate
Obtuve

3
Confirmando que esto funciona en Rails 4.1.0 en un inicializador.
Amal Chaudhuri

Respuestas:


314

Para apagarlo:

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

Para volver a encenderlo:

ActiveRecord::Base.logger = old_logger

1
¿Hay algún lugar donde pueda poner esto para deshabilitar la salida de SQL de forma permanente? Intenté agregarlo a envs / dev.rb pero no tuve suerte.
samvermette

55
puedes poner este código .irbrc, que es básicamente .bashrcpara la consola de Rails. de hecho, puede hacer casi cualquier cosa .irbrcsi lo desea, por ejemplo, coloreado de sintaxis, historial, editar código en vi y luego ejecutarlo en la consola de Rails, etc. verifique mi gema utility_beltsi está en Ruby 1.8 o en el puerto Ruby 1.9 llamadoflyrb
Giles Bowkett

2
@giles bowkett: En realidad, .irbrces como .bashrcpero en realidad para su línea de comandos interactiva ruby . No es una cosa de rieles. Me imagino que probablemente obtendrá errores si intenta hacer referencia a las clases de rails cuando estaba ejecutando irb fuera de un entorno de rails.
eremzeit

9
@samvermette puedes hacerlo en un archivo de configuración. Por ejemplo:config/initializers/activerecord_logger.rb
Uri

15
ActiveRecord::Base.logger.level = 1es una respuesta mucho mejor ya que no generará excepciones si usa .info y otros.
Henry sucio

72

Aquí hay una variación que considero algo más limpia, que todavía permite otros posibles registros desde AR. En config / entornos / development.rb:

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

Extraño, no para mí, en Rails 3.0 o 3.1. ¿Por qué su Rails.logger sería nulo en un bloque after_initialize, hizo algo más para personalizar su pila de inicio Rails u olvidó config.after_initialize?
jrochkind 05 de

1
Funciona muy bien en mi aplicación Rails 3.1. Parece que es la mejor solución. +1
Martijn

No funciona para mí ... establece el nivel OK en el bloque after_initialize, pero el nivel vuelve a 0 cuando la consola está abierta. Extraño. (Estoy usando Pry como reemplazo de la consola, ¿es por eso?)
Mike Blyth el

63

Puede que esta no sea una solución adecuada para la consola, pero Rails tiene un método para este problema: Logger # silence

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

44
Solo funcionará hasta Rails 3: "ADVERTENCIA DE DEPRECACIÓN: el silencio está en desuso y se eliminará de Rails 4.0"
Kangur

66
@Kangur Estoy en los carriles 4.2 y el silencio parece funcionar bien
Benjamin Crouzier

2
@Kangur También puedo confirmar que este enfoque funciona bien en Rails 4.2
Greg Matthew Crossley

66
Funciona en Rails 5 y no veo advertencias. Esta es la mejor respuesta de la OMI.
Sobrecarga119

1
Funciona bien en Rails 6. ¿Tal vez solo se ha movido un poco?
johncip

16

Para Rails 4 puede poner lo siguiente en un archivo de entorno:

# /config/environments/development.rb

config.active_record.logger = nil

Eso solo surtiría efecto en la producción, donde la tala está mayormente suprimida de todos modos ...
Rob

13

En caso de que alguien quiere realmente noquear a la tala instrucción SQL (sin cambiar el nivel de registro, y al mismo tiempo mantener el registro de sus modelos AR):

La línea que escribe en el registro (en Rails 3.2.16, de todos modos) es la llamada a debugin lib/active_record/log_subscriber.rb:50.

Ese método de depuración está definido por ActiveSupport::LogSubscriber.

Entonces podemos eliminar el registro sobrescribiéndolo así:

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

Bueno Esto funciona en el registro de SQL sin afectar las Rails.logger.debugdeclaraciones.
Teemu Leisti

Novato total aquí. ¿Dónde exactamente debemos poner esto?
devius

Lo guardo en lib / monkeypatch.rb y tienen carriles de extracción en la línea siguiente en config / application.rb: Dir.glob( "./lib/*.{rb}" ).each{ | file | require file }. Tenga en cuenta que el parche de mono está mal visto por algunos. Probablemente no debería verificar esto en su código de producción.
fakeleft

8

Usé esto: config.log_level = :info editar-enconfig/environments/performance.rb

Funciona muy bien para mí, rechaza la salida de SQL y muestra solo renderizado e información importante.


Estoy en rails 4.1.0 y me funcionó bien. gracias
Zakaria

4

En Rails 3.2 estoy haciendo algo como esto en 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

Como un FYI, en Rails 2 puedes hacer

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

Obviamente, las llaves podrían reemplazarse con un do endbloque si lo desea.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.