2015-03-03 13 views
12

Nella mia applicazione Rails, ho creato il seguente silenziatore di backtrace, come suggerito da Michael Hartl nel suo Rails tutorial:Backtrace Silenziatore non funziona

Rails.backtrace_cleaner.add_silencer { |line| line =~ /rvm/ } 

Ma ancora ottenere tutto il rumore che intendevo filtrare :

7:13:55 - INFO - Running: test/controllers/tags_controller_test.rb 
Started 

ERROR["test_should_get_index", TagsControllerTest, 0.45206] 
test_should_get_index#TagsControllerTest (0.45s) 
ActionController::UrlGenerationError:    
ActionController::UrlGenerationError: No route matches {:action=>"index", :controller=>"tags"} 
     /Users/chris/.rvm/gems/ruby-2.0.0-p353/gems/actionpack-4.1.6/lib/action_dispatch/journey/formatter.rb:39:in `generate' 
     /Users/chris/.rvm/gems/ruby-2.0.0-p353/gems/actionpack-4.1.6/lib/action_dispatch/routing/route_set.rb:599:in `generate' 

Chiaramente la stringa "rvm" è presente nelle ultime due righe. Ma ancora si presentano. Cambiare la stringa in ".rvm" non ha fatto alcuna differenza.

+0

Ciao - hai mai risolto questo problema? – garythegoat

+2

No, mi dispiace. Spero ancora di ottenere qualche risposta qui da qualche tempo .. – Flip

+1

Risolto ancora? Sono andato avanti e indietro e nel codice di Backtrace e niente funziona. Sta filtrando correttamente l'output, ma ciò che viene dato in uscita alla console non è l'output filtrato di Backtrace! – GigaBass

risposta

4

Questo è a causa della https://github.com/vipulnsward/rails/blob/ecc8f283cfc1b002b5141c527a827e74b770f2f0/actionpack/lib/action_dispatch/middleware/debug_exceptions.rb#L155-L156

Da application_trace è vuota (Questo è perché l'errore non è da codice utente ma errore percorso), si ricada a framework_trace, che non filtrarla (filtra solo rumore) .

È possibile risolverlo creando il proprio log_formatter. Nel vostro development.rb e/o test.rb aggiungere

config.log_formatter = SilentLogger.new 
config.log_formatter.add_silencer { |line| line =~ /rvm/ } 

E creare semplici di classe in modelli con unico metodo call richiesto. Qui puoi modificare il tuo backtrace come desideri.

class SilentLogger 
    def initialize 
    @silencers = [] 
    end 

    def add_silencer(&block) 
    @silencers << block 
    end 

    def call(severity, timestamp, progname, msg) 
    backtrace = (String === msg) ? "#{msg}\n" : "#{msg.inspect}\n" 

    return backtrace if @silencers.empty? 

    @silencers.each do |s| 
     backtrace = backtrace.split("\n").delete_if { |line| s.call(line) } 
    end 

    backtrace.join("\n") 
    end 
end 
-2

I registri mostrano /.rvm/ l'impostazione /rvm/ - può essere questa la causa? Fai un tentativo e non dimenticare di fermare/riavviare il server.

+2

Corrisponderebbe comunque – mharris7190

Problemi correlati