2013-02-17 10 views
5

sto usando rubino logger di serie, voglio uno al giorno a rotazione, quindi nel mio codice che ho:La creazione di un unico registro ogni giorno con rubino Logger di serie

Logger.new("#{$ROOT_PATH}/log/errors.log", 'daily') 

E 'perfettamente funzionante, ma ha creato due file errors.log.20130217 e errors.log.20130217.1.

Come posso costringerlo a creare un solo file al giorno?

+2

sembra che tu stia creando un nuovo logger nel tuo file di ambiente. Tuttavia, esiste già uno esistente? Inoltre, hai riavviato l'app per i binari dopo aver creato la nuova linea di Logger? – kobaltz

+1

È difficile capire esattamente quello che vuoi, ma hai dato un'occhiata a "[logrotate] (http://linuxcommand.org/man_pages/logrotate8.html)", che è una parte standard di * nix? Può ruotare i registri per molti criteri diversi in modi diversi. –

+0

@kobaltz, sì, ho più di un processo per accedere allo stesso log, e sì, ho riavviato le rotaie, ma nota che la maggior parte dei miei registri non sono nemmeno in binari piuttosto che in ruby ​​worker, il Tin Man, è facile, voglio solo avere un file di registro invece di più log ogni giorno –

risposta

11

Il codice è corretto per un'applicazione a esecuzione prolungata.

Che cosa sta succedendo è che si sta eseguendo il codice più di una volta in un dato giorno.

La prima volta che viene eseguito, Ruby crea un file di registro "errors.log".

Quando il giorno cambia, Ruby rinomina il file in "errors.log.20130217".

Ma in qualche modo hai eseguito nuovamente il codice, forse stai utilizzando due app (o processi, o worker o thread) che usano un codice simile, e il tuo logger ha visto che il nome del file "errori.log.20130217" già esistito.

tuo logger non voleva clobber quel file, ma ancora bisogno di rinominare "errors.log" a una data, in modo che il registratore, invece ha creato un diverso nome di file "errors.log.20130217.1"

Per risolvi questo, esegui il tuo codice solo una volta.

Se si eseguono più app denominate "foo" e "bar", utilizzare nomi di file di registro come "foo-errors.log" e "bar-errors.log". Oppure, se stai utilizzando più lavoratori, assegna a ciascun lavoratore il proprio nome di file di registro (ad esempio, utilizzando l'id di processo del lavoratore o l'indice dell'array pool di worker, o comunque stai tenendo traccia dei tuoi dipendenti).

Se si desidera risolvere questo problema utilizzando il programma di registrazione Ruby, è necessario eseguire l'override del programma di registrazione #shift_log_period in modo che non scelga il suffisso ".1". Puoi sottoclasse Logger e scrivi il tuo #shift_log_period usurato per rilevare che esiste un file di registro esistente per la data e, in caso affermativo, utilizzarlo invece di rinominare il file.

Questo è il codice facendolo dal registratore:

def shift_log_period(period_end) 
    postfix = period_end.strftime("%Y%m%d") # YYYYMMDD 
    age_file = "#{@filename}.#{postfix}" 
    if FileTest.exist?(age_file) 
    # try to avoid filename crash caused by Timestamp change. 
    idx = 0 
    # .99 can be overridden; avoid too much file search with 'loop do' 
    while idx < 100 
     idx += 1 
     age_file = "#{@filename}.#{postfix}.#{idx}" 
     break unless FileTest.exist?(age_file) 
    end 
    end 
    @dev.close rescue nil 
    File.rename("#{@filename}", age_file) 
    @dev = create_logfile(@filename) 
    return true 

non esiste una soluzione (per quanto ne so) utilizzando il logger rubino, con la sua built-in dei rotatori, come gestire i registri scritti da più applicazioni (aka lavoratori , processi, fili) contemporaneamente. Questo perché ciascuna app ottiene il proprio handle del file di registro.

In alternativa, utilizzare uno dei buoni strumenti di registro dei rotatori, come logrotate come suggerito dall'utente Tin Man nei commenti questione: http://linuxcommand.org/man_pages/logrotate8.html

In generale, logrotate sarà la vostra migliore IMHO scommessa.

+0

Man hai assolutamente ragione, sto usando lo stesso log da più di un worker, e qualche volta riavvio i processi, ma puoi spiegare di più su prefisso "" # {$ ROOT_PATH} /log/myapp-errors.log "hai suggerito? grazie mille per il tuo aiuto –

+0

Prego. Ho aggiunto più informazioni per te. – joelparkerhenderson

+0

Ho un problema che non riesco a riavviare applicazione su base giornaliera e ho bisogno di creare un file di registrazione ogni giorno. C'è qualche soluzione per questo in rubino o dovrò andare con l'opzione logrotate? –

Problemi correlati