Como posso desativar o log de mensagens de pipeline de ativos (sprockets) no Ruby on Rails 3.1?

378

As engrenagens tendem a ser bastante detalhadas no log (dev) por padrão em Ruby on Rails 3.1 (RC1):

Started GET "/assets/application.css" for 127.0.0.1 at 2011-06-10 17:30:45 -0400
Compiled app/assets/stylesheets/application.css.scss  (5ms)  (pid 6303)


Started GET "/assets/application.js" for 127.0.0.1 at 2011-06-10 17:30:45 -0400
Compiled app/assets/stylesheets/default.css.scss  (15ms)  (pid 6303)

...
Started GET "/assets/default/header_bg.gif" for 127.0.0.1 at 2011-06-10 17:30:45 -0400
Served asset /default/header_logo.gif - 304 Not Modified  (7ms)  (pid 6303)
Served asset /default/header_bg.gif - 304 Not Modified  (0ms)  (pid 6246)
Served asset /default/footer_bg.gif - 304 Not Modified  (49ms)  (pid 6236)
...

Eu gostaria de reduzir o nível de verbosidade ou desativá-lo completamente.

Estou assumindo que existe uma maneira limpa de desativar ou reduzir a verbosidade do log adicionando uma linha de configuração em um environment.rbou development.rbsemelhante ao config.active_record.logger = nilqual silencia as instruções do ActiveRecord SQL.

istvanp
fonte
Alguém relatou um bug sobre isso: # 2639 . Ainda "aberto" a partir de 9/2.
istvanp 02/09
14
A resposta aceita para esta pergunta deve ser alterada ou atualizada. No Rails 3.2, você pode simplesmente colocar config.assets.debug = falseno seu development.rb.
Stewart Johnson
7
@StewartJohnson - config.assets.debug = falseirá concatenar ativos em uma única file- não o que a maioria das pessoas quer em desenvolvimento
Yarin

Respostas:

382

Coloque o seguinte código em config/initializers/quiet_assets.rb

if Rails.env.development?
  Rails.application.assets.try(:logger=, Logger.new('/dev/null'))
  Rails::Rack::Logger.class_eval do
    def call_with_quiet_assets(env)
      previous_level = Rails.logger.level
      Rails.logger.level = Logger::ERROR if env['PATH_INFO'] =~ %r{^/assets/}
      call_without_quiet_assets(env)
    ensure
      Rails.logger.level = previous_level
    end
    alias_method_chain :call, :quiet_assets
  end
end

Atualizado: Agora também funciona para Ruby on Rails 3.2 (correções de tentativas anteriores before_dispatch, e agora estamos indo para o rack raizcall )

Atualização: Uma solução de middleware de rack adequada (em vez de frágil alias_method_chain) de @macournoyer https://github.com/rails/rails/issues/2639#issuecomment-6591735

choonkeat
fonte
3
A partir do Rails 3.2.1, esses puxões por si só não impedem o registro da roda dentada e o arquivo do choonkeat ainda é necessário.
IAmNaN
5
De fato. Parece que esse arquivo sempre será necessário, pois a configuração config.assets.loggerpara false apenas silenciará o que o Sprockets produz. Isso silencia as solicitações / respostas do Action Pack, que é algo que os desenvolvedores do Rails disseram que não pretendem silenciar em casos especiais .
Ben Kreeger
32
uhm. você deve colocar isso no núcleo dos trilhos. torná-lo uma opção no config.assets
jsharpe
2
No windows, substitua '/dev/null'por ' NUL'
Matt
4
Obras para me on Rails 4.2.0
motor de série
189

Dê uma olhada em https://github.com/evrone/quiet_assets e inclua-a no seu arquivo Gem.

Para os preguiçosos: gem 'quiet_assets', group: :development

rota
fonte
6
Ótimo trabalho, mas muito triste que uma gema separada seja necessária para isso.
Adam Spires
11
Acho que Jose Valim tomou a decisão certa aqui. Os trilhos do github.com/rails/rails/issues/2639 precisam registrar todas as solicitações recebidas e eu concordo com isso, acho que podemos nos livrar dessa sobrecarga quando as engrenagens suportarem o mapa de origem github.com / sstephenson / sprockets / issues / 310
route
5
para o preguiçoso: gem 'quiet_assets'(por favor, adicione este para o cargo :))
reto
52

Para Ruby on Rails 3.2, adicione config.assets.logger = falseao seu arquivo de configuração do ambiente de desenvolvimento, normalmente encontrado em config/environments/development.rb. Veja # 4512 .

ouranos
fonte
Funciona no aumento 4 conforme o esperado. Necessário reiniciar o servidor para fazer isso funcionar.
Langusten Gustel 18/09/2013
2
O Rails 4.0.2 config.assets.logger = nilfunciona para mim
byterussian
4
Rails 4.0.4 config.assets.logger = nilnão funciona para mim
hendrikbeck
28

Duas coisas são suficientes:

  1. config.assets.debug = false no config/enviroments/development.rb
  2. rake assets:precompile. Veja o comentário de @oma abaixo; isso não é necessário

Isso é tudo!

Lisovsky Vlad
fonte
19
1. está correto. Obrigado! Por favor, remova Não 2. rake assets:precompilenão é algo que quero fazer no desenvolvimento
oma
Embora isso provavelmente não tenha funcionado no momento em que a pergunta original foi postada, ela funciona agora (e, como afirmou o @Race, na versão 3.2.3) e deve existir a resposta aceita agora.
Radiospiel
2
Como o istvanp aponta abaixo, isso não faz o que você pensa que faz. Ele apenas compila todos os ativos JS e CSS em um único arquivo grande - não desativa o log de ativos.
Davidgoli
2
Isso é tudo o que é necessário em trilhos 4.2.2
thisfeller
Além do que @davidgoli disse: config.assets.debug controla a concatenação de ativos. Desativar isso significa que a depuração, por exemplo, JS e CSS usando o navegador, se tornará mais trabalhosa. Algo como quiet_assets reprimirá o log sem fazer com que você precise alternar assets.debug para, bem, depurar.
johncip
27

Eventualmente, será config.assets.logger = nil, mas essa parte está atualmente em stub no master (ainda não concluída).

colinross
fonte
5
Também não funciona para mim no Rails 3.1.3. @nessur: você tem certeza de que funciona para você? Como Tim diz, o número 2639 ainda está aberto e não vejo nenhuma indicação nesse problema de nenhuma correção (as duas solicitações de recebimento referenciadas foram rejeitadas).
Adam Spiers
Isso não será implementado como nesta etapa. github.com/rails/rails/issues/4569
23inhouse 9/09/12
@AdamSpiers conforme o link: github.com/rails/rails/pull/3795#issuecomment-3549669 "O Rails não fará caso especial de nenhum dos registradores ou middlewares relacionados ao registrador para não registrar rotas específicas"
23inhouse
3
Vadio. O Rails 4 ainda não pode desabilitar facilmente o registro de ativos.
Tom Rossi
11
Estou usando o Rails 4.2, coloque isso no meu development.rbe desativou o log de ativos.
Jack
12

Eu sei que é uma solução feia e temporária, mas eu uso isso:

tail -f log / development.log | grep -vE 'ativo'

Sucrenoir
fonte
9
Segue-se um um melhorado que remove as linhas em branco, bem como:tail -f log/development.log | grep -vE "(^\s*$|asset)"
istvanp
12

Muitas pessoas estão confusas sobre o uso de config.assets.logger = false. Aqui está o que faz e o que não faz.

De acordo com a documentação de origem :

Definir config.assets.loggercomo false desativará o log de ativos atendidos.

No entanto, isso provavelmente não é o que você pensa que é. Desativa apenas logs de 'exibição' de roda dentada , não os logs de solicitação do pacote de ação do Ruby on Rails. O mantenedor do Ruby on Rails explica isso claramente aqui: https://github.com/rails/rails/issues/4569#issuecomment-3594500


Tomando o exemplo do link, logs como este estão desabilitados:

Ativo exibido /jquery.isotope.js - 304 não modificado (0ms)

Mas logs como este não são

Iniciado GET "/assets/jquery.isotope.js?body=1" para 127.0.0.1 em 20-01-2012 23:16:46 -0500

lulalala
fonte
10
config.assets.quiet = true

Este é o último caminho a percorrer.

Adam Waite
fonte
Funciona perfeitamente em Rails 5. Apenas despejar isso emdevelopment.rb
Andreykul
Juntamente com depuração, não resolve todas as minhas necessidades em Rails 5.
Pysis
7

Usar:

Rails.application.assets.logger = Logger.new(RUBY_PLATFORM =~ /(win|w)32$/ ? "NUL" : "/dev/null")
Rails::Rack::Logger.class_eval do
  def call_with_quiet_assets(env)
    previous_level = Rails.logger.level
    Rails.logger.level = Logger::ERROR if env['PATH_INFO'].index("/assets/") == 0
    call_without_quiet_assets(env).tap do
      Rails.logger.level = previous_level
    end
  end
  alias_method_chain :call, :quiet_assets
end

É o mesmo código que choonkeat adicionou . Eu apenas o incluí para funcionar no Windows também.

Celso Dantas
fonte
7

No arquivo development.rb em config / environment, você encontrará a linha config.assets.debug = true.

Alterne para falsee a maior parte da saída de carga do ativo desaparecerá. No meu sistema, apenas as duas solicitações, para application.css e .js, permanecem.

TKAB
fonte
3
Essa configuração apenas permite que você divida as folhas de estilo e o javascript em arquivos separados quando definido como true para facilitar a depuração. Quando definido como false (o padrão), agrupa todos eles em um arquivo grande. Portanto, de fato, reduz a saída de depuração, mas se você tiver imagens, por exemplo, elas não serão afetadas. Informações do guia oficial aqui .
Istvanp
11
Eu vejo. Obrigado por esclarecer isso. Mas não mudei a configuração dessa variável, então meu padrão era true.
TKAB 10/09
5

No arquivo config / environment / development.rb , adicione:

config.assets.debug = false

config.assets.logger = false
Najam Tariq
fonte
2

Lograge para a vitória - mata os padrões irritantes do criador de logs do Ruby on Rails imediatamente (por exemplo, registro de ativos, registro de renderização parcial) e é personalizável se você deseja adicionar / remover itens específicos.

Yarin
fonte
0

A solução vinculada mencionada anteriormente ajuda a:

https://github.com/evrone/quiet_assets

Também como abaixo, está funcionando bem para mim:

3.1 (apenas) (3.2 intervalos antes do envio)

app\config\initializers\quiet_assets.rb

Rails.application.assets.logger = Logger.new('/dev/null')
Rails::Rack::Logger.class_eval do
  def before_dispatch_with_quiet_assets(env)
    before_dispatch_without_quiet_assets(env) unless env['PATH_INFO'].index("/assets/") == 0
  end
  alias_method_chain :before_dispatch, :quiet_assets
end
3.2 Rails - Rack root tap approach
app\config\initializers\quiet_assets.rb

Rails.application.assets.logger = Logger.new('/dev/null')
Rails::Rack::Logger.class_eval do
  def call_with_quiet_assets(env)
    previous_level = Rails.logger.level
    Rails.logger.level = Logger::ERROR if env['PATH_INFO'].index("/assets/") == 0
    call_without_quiet_assets(env).tap do
      Rails.logger.level = previous_level
    end
  end
  alias_method_chain :call, :quiet_assets
end
Sumit Munot
fonte
-1

Em config / environment, adicione config.log_level = :erroraos arquivos .rb que você deseja alterar. Isso alterará as configurações de log para apenas erro.

Chris O
fonte
Infelizmente não, porque eu uso principalmente o log para examinar os dados SQL e de solicitação que estão no nível de depuração. As mensagens de ativos são do nível de informações (que é menor que o nível de depuração), portanto, não adianta obter o que quero com essa configuração.
istvanp 02/09
2
Isso não é uma boa ideia. Ele ocultará outras mensagens no nível de informações que você talvez ainda queira registrar.
ifightcrime