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.
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
È 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. –
@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 –