2010-02-11 17 views
88

In un'attività rake se utilizzo il comando puts, viene visualizzato l'output sulla console. Tuttavia non vedrò quel messaggio nel file di registro quando l'app viene distribuita in produzione.puts vs logger nei binari di rake task

Tuttavia se dico Rails.logger.info allora in modalità sviluppo non vedo nulla su console. Ho bisogno di andare a file di registro e coda.

Preferirei utilizzare Rails.logger.info e in modalità di sviluppo all'interno dell'attività rake, l'output dal registratore dovrebbe anche essere inviato alla console.

C'è un modo per farlo?

+2

+1 Stavo solo pensando di fare la stessa domanda. –

risposta

9

Direi che usare Rails.logger.info è la strada da percorrere.

Non sarà possibile visualizzarlo nella console del server perché non verrà eseguito tramite il server. Basta aprire una nuova console e il file di registro tail -f, farà il trucco.

Molti utenti sono consapevoli della UNIX® comando 'coda', che può essere utilizzato per visualizzazione le ultime righe di un file di grandi dimensioni . Questo può essere utile per la visualizzazione di file di registro, ecc

Ancora più utile in alcune situazioni, è il parametro '-f' per la 'coda' comando. Ciò causa la coda per "seguire" l'output del file. Inizialmente, la risposta sarà la stessa di "coda" a sé stante: verranno visualizzate le ultime righe del file. Tuttavia, il comando non restituisce al prompt e, invece, continua per "seguire" il file. Quando vengono aggiunte ulteriori linee al file, esse verranno visualizzate sul terminale come . Questo è molto utile per guardare i file di registro, o qualsiasi altro file che può essere aggiunto nel tempo. Digita "man tail" per ulteriori dettagli su questa e altre opzioni tail .

(via)

+0

Ma non è molto comodo mentre si lavora sul computer locale poiché non si vede l'output nella stessa finestra in cui è stata definita l'attività. Soprattutto se non si dispone di un grande schermo per adattarsi a più finestre affiancate. –

+9

Ancora meglio usare 'tailf'" È simile alla coda -f ma non accede al file quando non cresce "(dalla pagina man). È anche più corto – MBO

+0

@tomas perché non ridurre la console di registro del server e avere solo la console con il tail-f in esecuzione? Ad ogni modo non è un problema reale ... Sto correndo come 8 console per tracciare quello che succede nella mia app, basta passare da una scheda all'altra quando si lavora su una parte specifica del sistema, non importa imho – marcgg

10

compiti Rake sono gestite da un utente, su una linea di comando. Tutto ciò che devono sapere subito ("5 righe elaborate") deve essere inviato sul terminale con puts.

Tutto ciò che deve essere conservato per i posteri ("e-mail di avviso inviata a [email protected]") deve essere inviato allo Rails.logger.

+11

Non è raro eseguire attività rake con cron. –

+2

Vero. Se desideri che i messaggi di log ti vengano inviati via email al termine del processo cron, sputali a $ stdout o $ stderr. –

3

Come creare un helper di applicazione che rileva quale ambiente è in esecuzione e fa la cosa giusta?

def output_debug(info) 
    if RAILS_ENV == "development" 
     puts info 
    else 
     logger.info info 
    end 
end 

quindi chiamare output_debug invece che mette o Logger.INFO

+4

Non penso che sia una buona idea. Il logger Rails è pensato per essere configurabile, ma invece di usare quella configurabilità stai solo accumulando più strati sopra di esso qui. –

+0

Sì, non è una buona idea poiché lo stesso controllo verrà effettuato * ogni volta * si desidera registrare qualcosa. – furiabhavesh

46

mettere questo in application.rb, o in un task rake inizializzare il codice

if defined?(Rails) && (Rails.env == 'development') 
    Rails.logger = Logger.new(STDOUT) 
end 

Questo è Rails 3 Codice. Si noti che questo sovrascrive la registrazione su development.log.Se si desidera sia STDOUT e development.log avrete bisogno di una funzione wrapper.

Se si desidera questo comportamento solo nella console di Rails, inserire lo stesso blocco di codice nel proprio ~/.irbrc.

+1

come faccio a farlo in rotaie 2? – Joelio

+23

Non sarebbe più semplice inserire 'Rails.logger = Logger.new (STDOUT)' in development.rb? – ghempton

+0

Per i binari 2, inserisci questo nel tuo file development.rb: 'config.logger = Logger.new (STDOUT)' – jsarma

1

Eseguire un lavoro in background con '&' e aprire script/console o altro. In questo modo è possibile eseguire più comandi nella stessa finestra.

tail -f log/development.log & 
script/console 
Loading development environment (Rails 2.3.5) 
>> Product.all 
2011-03-10 11:56:00 18062 DEBUG Product Load (6.0ms) SELECT * FROM "products" 
[<Product.1>,<Product.2>] 

nota possibile ottenere sciatta rapidamente quando c'è un sacco di output della registrazione.

2

In Rails 2.X per reindirizzare lo strumento al STDOUT nei modelli:

ActiveRecord::Base.logger = Logger.new(STDOUT) 

Per reindirizzare logger nel controller:

ActionController::Base.logger = Logger.new(STDOUT) 
+0

Ho trovato anche questo articolo, molto utile http://www.sepcot.com/blog/2009/08/ rails-logging-to-stdout –

24

è possibile creare una nuova attività rastrello per arrivare a questo lavoro .

desc "switch logger to stdout" 
task :to_stdout => [:environment] do 
Rails.logger = Logger.new(STDOUT) 
end 

In questo modo quando si esegue il vostro compito rake è possibile aggiungere to_stdout primo a ricevere messaggi di log stdout o non comprendono di avere i messaggi inviati al file di log di default

rake to_stdout some_task 
+0

idea eccellente! –

2

Codice

Per Rails 4 e successivi, è possibile utilizzare Logger broadcast.

Se si desidera ottenere sia STDOUT e la registrazione di file per le attività rastrello in modalità di sviluppo, è possibile aggiungere questo codice in config/environments/development.rb:

if File.basename($0) == 'rake' 
    # http://stackoverflow.com/questions/2246141/puts-vs-logger-in-rails-rake-tasks 
    log_file  = Rails.root.join("log", "#{Rails.env}.log") 
    Rails.logger = ActiveSupport::Logger.new(log_file) 
    Rails.logger.extend(ActiveSupport::Logger.broadcast(ActiveSupport::Logger.new(STDOUT))) 
    end 

prova

Ecco un piccolo compito Rake per verificare quanto sopra codice:

# lib/tasks/stdout_and_log.rake 
namespace :stdout_and_log do 
    desc "Test if Rails.logger outputs to STDOUT and log file" 
    task :test => :environment do 
    puts "HELLO FROM PUTS" 
    Rails.logger.info "HELLO FROM LOGGER" 
    end 
end 

Esecuzione rake stdout_and_log:test uscite

HELLO FROM PUTS 
HELLO FROM LOGGER 

mentre

HELLO FROM LOGGER 

è stato aggiunto a log/development.log.

corso rake stdout_and_log:test RAILS_ENV=production uscite

HELLO FROM PUTS 

mentre

HELLO FROM LOGGER 

è stato aggiunto alla log/production.log.

+0

In Rails 5, il trucco 'basename ($ 0) == 'rake'' non funziona più, perché il comando' rails' stesso esegue 'rake'. Mi piacerebbe trovare un buon sostituto per questo oltre a dipendere da un compito che imposta il 'broadcast'. (Quella parte, almeno, funziona ancora bene.) –