Creare file di log personalizzato

Ciao a tutti.
Mi sono da poco avvicinato a ruby e a rails.
L’esperimento di oggi é quello di creare un mio file di log
personalizzato.
Ho creato una azione che ho inserito momentaneamente in un modello:

def self.debug(daInserire)
logfile = File.open("#{RAILS_ROOT}/log/my.log", “a”)
mylog = Logger.new(logfile)
mylog.info(daInserire + " " + Time.now.to_s)
logfile.close
end

quando voglio debuggare qualcosa richiamo l’azione con:

self.debug(“Quello che voglio debuggare”)

E fin qui funziona, però…

mi chiedevo se ci fosse un modo (come avviene per i filtri) di inserire
da qualche parte (un posto comune come xes. l’application_controller per
i controller) l’azione da me creata potendola così richiamare sia da un
modello che da un controller senza doverla inserire ogni volta
all’interno del codice di quest’ultimi.

Voi che ne dite?

Un grazie anticipato a tutte le persone che mi vorranno aiutare.

Ciao

Premesso che se vuoi usare un file di log personalizzato puoi sostituire
senza alcun problema il default logger di Rails, ti consiglio di non
usare
un’azione ma di inserire direttamente il tuo logger nella fase di
inizializzazione.
In questo modo verrà automaticamente caricato solo al boot e reso
disponibile all’intera applicazione.

file /config/initializers/mylogger.rb

MYLOGGER = Logger.new("#{RAILS_ROOT}/log/my.log")

Finito! Da questo momento all’nterno do una tua qualsiasi
azione/modello/controller potrai invocare il logger, ad esempio.

class MyController
def action
MYLOGGER.warn “Custom warning.”
end
end

Nota come, invocando Logger.new passando il path al file non hai bisogno
di
gestire il file pointer poiché ci pensa il Logger.
Inoltre il logger viene salvato nel thread dell’applicazione e non viene
creata una nuova istanza con tanto di file handler ad ogni request.

Questo è solo un esempio.
A seconda di cosa dovrebbe servirti quel logger ci sono possibili strade
alternative.

– Simone

2009/8/27 pezzuya … [email protected]

logfile.close
i controller) l’azione da me creata potendola così richiamare sia da un


Ml mailing list
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml


Simone C.

Site & Blog: http://www.simonecarletti.com
Email: [email protected]
LinkedIn: http://linkedin.com/in/weppos
Nick: weppos | Skype: weppos

Dimenticavo… poiché sei in Rails, potresti volere usare
ActiveSupport::BufferedLogger invece di Logger.new.


Simone C.

Site & Blog: http://www.simonecarletti.com
Email: [email protected]
LinkedIn: http://linkedin.com/in/weppos
Nick: weppos | Skype: weppos

Ho creato un file “ilmiolog.rb” nella cartella initializers.

All’interno ho inserito:

mylog = Logger.new("#{RAILS_ROOT}/log/my.log")

Al riavvio di webrick il file viene creato correttamente nel percorso
specificato.

Quando però lo richiamo all’interno del modello con:

mylog.info(ciao + " " + Time.now.to_s)

Viene generato l’errore:

undefined local variable or method `mylog’ for #Class:0x4b477fc

potrebbe dipendere dal fatto che ho usato “info” al posto di “warn” ?

Simone C. wrote:

2009/8/27 pezzuya … [email protected]

potrebbe dipendere dal fatto che ho usato “info” al posto di “warn” ?

No, � perch� tu hai usato una variabile mentre io una costante.
Nell’initializer la variabile viene valutata nel contesto del blocco di
inizializzazione quindi viene persa immediatamente al termine del boot,
la
costante viene resa disponibile all’intera applicazione.

Ho provato a sostituire mylog con MYLOG in entrambe i file ma sembra non
vederla ugualmente. Ora l’errore é:

uninitialized constant User::MYLOG

:frowning:

2009/8/27 pezzuya … [email protected]

potrebbe dipendere dal fatto che ho usato “info” al posto di “warn” ?

No, è perché tu hai usato una variabile mentre io una costante.
Nell’initializer la variabile viene valutata nel contesto del blocco di
inizializzazione quindi viene persa immediatamente al termine del boot,
la
costante viene resa disponibile all’intera applicazione.


Simone C.

Site & Blog: http://www.simonecarletti.com
Email: [email protected]
LinkedIn: http://linkedin.com/in/weppos
Nick: weppos | Skype: weppos

2009/8/27 pezzuya … [email protected]

Sono un ciuccio…
mi ero dimenticato di riavviare webrick.
Grazie 1000.
Sei stato gentilissimo…alla prossima!

Mi sembrava strano. Ho eseguito al volo un test con un nuovo progetto e
funzionava.
http://gist.github.com/176229 :slight_smile:


Simone C.

Site & Blog: http://www.simonecarletti.com
Email: [email protected]
LinkedIn: http://linkedin.com/in/weppos
Nick: weppos | Skype: weppos

pezzuya … wrote:

Simone C. wrote:

2009/8/27 pezzuya … [email protected]

potrebbe dipendere dal fatto che ho usato “info” al posto di “warn” ?

No, � perch� tu hai usato una variabile mentre io una costante.
Nell’initializer la variabile viene valutata nel contesto del blocco di
inizializzazione quindi viene persa immediatamente al termine del boot,
la
costante viene resa disponibile all’intera applicazione.

Ho provato a sostituire mylog con MYLOG in entrambe i file ma sembra non
vederla ugualmente. Ora l’errore é:

uninitialized constant User::MYLOG

:frowning:

Sono un ciuccio…
mi ero dimenticato di riavviare webrick.
Grazie 1000.
Sei stato gentilissimo…alla prossima!