Desabilitar o log de log do Rails SQL no console

262

Existe uma maneira de desabilitar o log de consultas SQL quando estou executando comandos no console? Idealmente, seria ótimo se eu pudesse desativá-lo e reativá-lo com um comando no console.

Estou tentando depurar alguma coisa e usando "puts" para imprimir alguns dados relevantes. No entanto, a saída da consulta sql está dificultando a leitura.


Edit: Encontrei outra solução, já que a configuração do logger como nulo às vezes gerava um erro, se algo diferente do meu código tentasse chamar logger.warn

Em vez de definir o logger como nilvocê pode definir o nível do logger para 1.

ActiveRecord::Base.logger.level = 1 # or Logger::INFO
gylaz
fonte
since setting the logger to nil sometimes raised an erroryap .. Eu peguei este ao tentar executar rake db:migrate stackoverflow.com/questions/1719212/…
abbood
3
Confirmando que isso funciona no Rails 4.1.0 em um inicializador.
Amal Chaudhuri

Respostas:

314

Para desativá-lo:

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

Para ligá-lo novamente:

ActiveRecord::Base.logger = old_logger
Ryan Bigg
fonte
1
Existe algum lugar em que eu possa colocar isso para desativar a saída SQL permanentemente? Tentei adicioná-lo ao envs / dev.rb, mas não tive sorte.
precisa
5
você pode inserir esse código .irbrc, que é basicamente .bashrcpara o console do Rails. de fato, você pode fazer qualquer coisa, .irbrcse quiser, por exemplo, coloração de sintaxe, histórico, editar código no vi e executá-lo no console do Rails, etc. verifique minha gema utility_beltse estiver no Ruby 1.8 ou na porta Ruby 1.9 chamadoflyrb
Giles Bowkett
2
@ giles bowkett: Na verdade, .irbrcé como, .bashrcmas na verdade, para a sua linha de comando interativa ruby . Não é uma coisa dos trilhos. Eu imagino que você provavelmente obteria erros se tentasse fazer referência a classes de trilhos quando executava o irb fora de um ambiente de trilhos.
precisa
9
@samvermette você pode em um arquivo de configuração. Por exemplo:config/initializers/activerecord_logger.rb
Uri
15
ActiveRecord::Base.logger.level = 1é uma resposta muito melhor, pois não gera exceções se você usar .info e outros.
Dirty Henry
72

Aqui está uma variação que considero um pouco mais limpa, que ainda permite outros registros em potencial do AR. Em config / environment / development.rb:

config.after_initialize do
  ActiveRecord::Base.logger = Rails.logger.clone
  ActiveRecord::Base.logger.level = Logger::INFO
end
jrochkind
fonte
Estranho, não para mim, no Rails 3.0 ou 3.1. Por que seu Rails.logger seria nulo em um bloco after_initialize, você fez outra coisa para personalizar sua pilha de inicialização do Rails ou esqueceu o config.after_initialize?
Jrochkind
1
Funciona muito bem no meu aplicativo Rails 3.1. Parece a melhor solução. +1
Martijn
Não funciona para mim ... define o nível OK no bloco after_initialize, mas o nível volta a 0 quando o console é aberto. Estranho. (Estou usando Pry como um substituto console, é por isso?)
Mike Blyth
63

Pode não ser uma solução adequada para o console, mas o Rails tem um método para este problema: Logger # silence

ActiveRecord::Base.logger.silence do
  # the stuff you want to be silenced
end
Christoph Petschnig
fonte
4
Irá funcionar apenas para até Rails 3: "DEPRECATION AVISO: o silêncio é obsoleto e será removido do Rails 4.0"
Kangur
6
@Kangur estou nos trilhos 4.2 e silêncio parece funcionar bem
Benjamin Crouzier
2
@Kangur Também posso confirmar esta abordagem funciona muito bem on Rails 4.2
Greg Matthew Crossley
6
Funciona no Rails 5 e não vejo avisos. Esta é a melhor resposta IMO.
Overload119
1
Funciona bem no Rails 6. Talvez tenha sido mudado um pouco?
johncip 11/03
16

Para o Rails 4, você pode colocar o seguinte em um arquivo de ambiente:

# /config/environments/development.rb

config.active_record.logger = nil
Micah
fonte
Que só entraria em vigor em produção, onde o registo é mais suprimida qualquer maneira ....
Rob
13

Caso alguém queira realmente eliminar o log de instruções SQL (sem alterar o nível de log e mantendo o log de seus modelos de RA):

A linha que grava no log (no Rails 3.2.16, de qualquer maneira) é a chamada para debugin lib/active_record/log_subscriber.rb:50.

Esse método de depuração é definido por ActiveSupport::LogSubscriber.

Portanto, podemos eliminar o registro substituindo-o da seguinte maneira:

module ActiveSupport
  class LogSubscriber
    def debug(*args, &block)
    end
  end
end
fakeleft
fonte
Um bom. Isso funciona no log SQL sem afetar as Rails.logger.debuginstruções.
Teemu Leisti
Total noob aqui. Onde exatamente devemos colocar isso?
Devius
Eu mantê-lo em lib / monkeypatch.rb e têm trilhos puxá-lo com a seguinte linha no config / application.rb: Dir.glob( "./lib/*.{rb}" ).each{ | file | require file }. Lembre-se de que o monkeypatching é desaprovado por alguns. Provavelmente não deve verificar isso no seu código de produção.
Fakeleft
8

Eu usei isso: config.log_level = :info edit-inconfig/environments/performance.rb

Trabalhando muito bem para mim, rejeitando a saída SQL e mostrando apenas renderização e informações importantes.

Nate Ben
fonte
Estou nos trilhos 4.1.0 e funcionou bem para mim. graças
Zakaria
4

No Rails 3.2, estou fazendo algo parecido com isto em 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
Telmo Costa
fonte
2

Assim como um FYI, no Rails 2 você pode fazer

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

Obviamente, o aparelho pode ser substituído por um do endbloco, se você quiser.

Max Williams
fonte