mette vs logger in rails rake task


108

In un'attività rake, se uso il comando put, vedo l'output sulla console. Tuttavia non vedrò quel messaggio nel file di registro quando l'app viene distribuita in produzione.

Tuttavia, se dico Rails.logger.info, in modalità di sviluppo non vedo nulla sulla console. Devo andare al file di registro e seguirlo.

Vorrei idealmente usare Rails.logger.info e in modalità di sviluppo all'interno del task rake, anche l'output del logger dovrebbe essere inviato alla console.

C'è un modo per ottenerlo?

Risposte:


57

Inseriscilo application.rbo inizializza il codice in un'attività rake

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

Questo è il codice Rails 3. Tieni presente che questo sovrascriverà la registrazione a development.log. Se vuoi entrambi STDOUTe development.logavrai bisogno di una funzione wrapper.

Se desideri questo comportamento solo nella console di Rails, inserisci lo stesso blocco di codice nel file ~/.irbrc.


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

Per rails 2, inserisci questo nel tuo sviluppo.rb:config.logger = Logger.new(STDOUT)
jsarma

38

Potresti creare una nuova attività di rake per farlo funzionare.

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

In questo modo quando esegui il tuo compito rake puoi prima aggiungere to_stdout per ottenere i messaggi di log stdout o non includerlo per inviare i messaggi al file di log predefinito

rake to_stdout some_task

11

Le attività di rake vengono eseguite da un utente, su una riga di comando. Tutto ciò che hanno bisogno di sapere subito ("5 righe elaborate") dovrebbe essere visualizzato sul terminale con puts.

Tutto ciò che deve essere conservato per i posteri ("messaggio di avviso inviato a jsmith@example.com") deve essere inviato a Rails.logger.


17
Non è raro eseguire attività di rake con cron.
Johannes Gorset

2
Vero. Se vuoi che i messaggi di log ti vengano inviati via email quando il cron job è completo, sputali in $ stdout o $ stderr.
Jonathan Julian

10

Direi che l'utilizzo Rails.logger.infoè la strada da percorrere.

Non sarai in grado di vederlo nella console del server perché non verrà eseguito tramite il server. Basta aprire una nuova console e tail -fil file di registro, farà il trucco.

Molti utenti conoscono il comando UNIX® "tail", che può essere utilizzato per visualizzare le ultime righe di un file di grandi dimensioni. Può essere utile per visualizzare i file di registro, ecc.

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

( tramite )


Ma non è molto comodo lavorare sulla macchina locale poiché non vedi l'output nella stessa finestra in cui hai chiamato l'attività. Soprattutto se non hai uno schermo grande per adattarsi a più finestre affiancate.
Tomas Markauskas,

10
Ancora meglio è usare tailf"È simile a tail -f ma non accede al file quando non è in crescita" (dalla pagina di manuale). È anche più breve
MBO

@tomas, perché non ridurre a icona la console di log del server e avere solo quella console con tail-f in esecuzione? Comunque non è un vero problema ... Sto eseguendo come 8 console tracciando cosa sta succedendo nella mia app, passa da una
scheda

@mbo nice :) halas non sembra che sia disponibile sulla mia macchina (mac os @ leopard)
marcgg

1
@marcgg: non ho una "console del server" (io uso passeggero), ma la domanda riguarda le attività di rake e se esegui un'attività da una finestra del terminale, non vedi nulla dal logger in quella finestra. Devi avere un'altra finestra con development.log per vedere l'output. Idealmente, aggiungerei in qualche modo stdout come un altro flusso di output a Rails.logger, ma non rimuoverei quello originale.
Tomas Markauskas,

9

Codice

Per Rails 4 e versioni successive, puoi usare la trasmissione Logger .

Se vuoi ottenere sia STDOUT che la registrazione dei file per le attività di rake in modalità di sviluppo, puoi 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

Test

Ecco una piccola attività di Rake per testare il codice sopra:

# 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

rake stdout_and_log:testUscite in esecuzione

HELLO FROM PUTS
HELLO FROM LOGGER

mentre

HELLO FROM LOGGER

è stato aggiunto a log/development.log.

rake stdout_and_log:test RAILS_ENV=productionUscite in esecuzione

HELLO FROM PUTS

mentre

HELLO FROM LOGGER

è stato aggiunto a log/production.log.


In Rails 5, il basename($0) == 'rake'trucco non funziona più, perché il railscomando stesso viene eseguito rake. Mi piacerebbe trovare un buon sostituto per esso oltre a seconda di un'attività che imposta il file broadcast. (Quella parte, almeno, funziona ancora bene.)
Brent Royal-Gordon

@ BrentRoyal-Gordon Non c'è bisogno di questo condizionale nello sviluppo, puoi semplicemente aggiungere il codice alla Rakefileradice del tuo progetto
Mauricio Pasquier Juan

4

Che ne dici di creare un helper dell'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 chiama output_debug invece di put o logger.info


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

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


2

Esegui un lavoro in background con "&" e apri script / console o qualsiasi altra cosa. In questo modo puoi 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>]

note Può diventare sciatto rapidamente quando c'è molto output di registrazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.