2012-07-19 9 views
11

Ricordo di ottenere file di registro che erano ben ordinati, in modo da poter seguire una richiesta, poi la successiva e così via.Rails 3.2.2 file di registro non ordinati, richieste intrecciate

Ora, i file di registro sono, come il mio bambino di 4 anni dice "tutto scrostato", nel senso che non sono più blocchi separati di testo. I log di due richieste vengono intrecciati/mescolati.

Per esempio:

Started GET /foobar 
... 
Completed 200 OK in 2ms (Views: 0.4ms | ActiveRecord: 0.8ms) 
Patient Load (wait, that's from another request that has nothing to do with foobar!) 
[ blank space ] 
Something else 

Questo è esasperante, perché non posso dire che cosa sta accadendo all'interno di una singola richiesta.

Questo è in esecuzione su Passeggero.

+0

Penso sia correlato http://news.ycombinator.com/item?id=4483390 – fguillen

risposta

3

Sì !, hanno fatto alcuni cambiamenti nel ActiveSupport::BufferedLogger in modo che non è più in attesa fino a quando la richiesta è terminata per irrigare i registri:

Ma hanno aggiunto il ActiveSupport::TaggedLogging che è molto divertente e puoi timbro ogni registro con qualsiasi tipo di marchio desiderato.

Nel tuo caso potrebbe essere buono per timbro i registri con il richiesta UUID come questo:

# config/application.rb 
config.log_tags = [:uuid] 

Quindi, anche se i log sono incasinato è ancora in grado di seguire chi di loro corrispondono alla richiesta che stai seguendo.

È possibile rendere le cose più divertenti con questa caratteristica per aiutarvi nel vostro studio tronchi:

4

Se il valore di registro di produzione leggibilità su tutto il resto si può utilizzare la configurazione

PassengerMaxInstancesPerApp 1 

. Potrebbe causare alcuni problemi di ridimensionamento. In alternativa si potrebbe roba qualcosa di simile in application.rb:

process_log_filename = Rails.root + "log/#{Rails.env}-#{Process.pid}.log" 
log_file = File.open(process_log_filename, 'a') 
Rails.logger = ActiveSupport::BufferedLogger.new(log_file) 
+2

Se non sbaglio, se ti è capitato di ottenere un PID di un processo precedente, ciò sovrascriverebbe il vecchio file di registro. Questo potrebbe essere mitigato in una certa misura dalla rotazione frequente, ma dal momento che i PID non sono qualcosa su cui puoi contare, questo non è sicuro al 100%. Penso che tu voglia aggiungere un timestamp o qualcosa al nome del file di registro. Inoltre: il suggerimento PassengerMaxInstancesPerApp è piuttosto inutile, al limite di snarky; Lo rimuoverei dalla tua risposta. –

+6

Ho downvoted questa risposta, perché non dovresti mai suggerire che PassengerMaxInstancesPerApp cambi. È come suggerire una linea di codice che cancella la tua directory root se qualcuno ti chiede come liberare spazio su disco. Per favore rivedi. – trisweb

+0

PassengerMaxInstancesPerApp è in parte uno scherzo, ma anche una soluzione reale se lo si utilizza durante lo sviluppo. –

0

Dovrebbero aggiungere un po 'reqid quasi casuale e scrivere in ogni riga per quanto riguarda una singola richiesta. In questo modo non ti confonderai.

3

Beh, per me la soluzione TaggedLogging è un no go, Posso vivere con alcuni registri persi se il server si blocca male, ma voglio che i miei registri siano perfettamente ordinati. Così, seguendo il consiglio di the issue comments sto applicando questo al mio app:

# lib/sequential_logs.rb 
module ActiveSupport 
    class BufferedLogger 
    def flush 
     @log_dest.flush 
    end 
    def respond_to?(method, include_private = false) 
     super 
    end 
    end 
end 

# config/initializers/sequential_logs.rb 
require 'sequential_logs.rb' 

Rails.logger.instance_variable_get(:@logger).instance_variable_get(:@log_dest).sync = false 

Per quanto posso dire che questo non ha influenzato la mia app, è ancora in esecuzione e ora i miei registri di fare di nuovo un senso.

0

Non l'ho usato, ma credo che Lumberjack's unit_of_work method potrebbe essere quello che stai cercando. Si chiama:

Lumberjack.unit_of_work do 
    yield 
end 

E tutta la registrazione fatta sia in quel blocco o nel blocco ceduto sono etichettati con un ID univoco.

Problemi correlati