2010-03-18 9 views
7

Mi manca davvero qualcosa di ovvio, ma ho problemi con l'uso generale di Log4r nella mia applicazione Ruby. Sono in grado di accedere senza problemi, ma l'overhead sembra goffo come l'ho installato. In pratica sto passando il percorso completo a un nome file per accedere a ogni classe nella mia applicazione. Lo script ruby ​​che viene chiamato estrae il file di log da uno degli argomenti in ARGV che viene poi passato in giro e impostato in ogni classe che io chiamo in ruby. In ogni classe, uso patternFormatter per inserire il nome della classe/file nell'istruzione del registro.Utilizzare correttamente Log4r in Ruby Application

C'è un modo migliore per farlo funzionare? Sembra che qualunque cosa io pensi richiederà qualcosa da passare a ogni classe nella mia applicazione rubino. Potrei impostare il file di registro in un file di configurazione yaml, ma poi passerei il file di configurazione a ogni classe.

Qualche consiglio? Se questo non ha senso, potrei provare a postare alcuni esempi di codice più specifici per spiegare meglio cosa intendo.

Grazie!

risposta

12

Hmm, qualsiasi motivo per cui non si istanzia la classe Log4r::Logger all'inizio del copione e si passa l'istanza in giro? Non hanno nemmeno bisogno di passare in giro, si può sempre ottenere per nome da Logger classe:

run.rb:

require 'log4r' 
require 'class_a' 

logger = Log4r::Logger.new('test') 
logger.outputters << Log4r::Outputter.stdout 
logger.outputters << Log4r::FileOutputter.new('logtest', :filename => 'logtest.log') 
logger.info('started script') 
a = A.new 
a.do_something 
logger.info('finishing') 

class_a.rb:

class A 
    def do_something 
    logger = Log4r::Logger['test'] 
    logger.info('in do_something') 
    puts 'hi!' 
    end 
end 

e quando si esegue run.rb si ottiene:

$ ruby run.rb 
INFO test: started script 
INFO test: in do_something 
hi! 
INFO test: finishing 

e un file di registro denominato logtest.log su disco.

+0

Non riesco a farlo funzionare. La chiamata a Logger ['mylog'] in un altro file .rb restituisce nil. – Spencer

+0

E come potrei comunicare a Logger a quale file accedere? – Spencer

+0

Dai un'occhiata all'esempio aggiornato sopra. Cosa intendi quando dici "un altro file .rb"? –

13

Sono il manutentore di log4r,

Per i singoli script (diversi file .RB), si potrebbe avvicina a questo in pochi modi diversi (montaggio, lo so), in primo luogo, essere consapevoli che le caratteristiche di I La copertura qui è disponibile in> = 1.1.4.

Un modo sarebbe di impostare una stringa PatternFormatter differente per script (se si crea un file di configurazione yaml o xml, è possibile specificare diversi modelli in base al nome della classe).

Un altro modo sarebbe utilizzare uno di GDC, NDC o MDC in un PatternFormatter.

GDC imposterà un "contesto diagnostico globale", vale a dire, è un valore disponibile da tutti i thread che eseguono uno script. È possibile utilizzarlo inserendo% g nel modello e impostando il valore tramite GDC.set (String) per informazioni più dettagliate, vedere: http://log4r.rubyforge.org/manual.html

NDC e MDC sono rispettivamente contesti diagnostici nidificati e mappati. Il pattern per questi è utilizzare% x e% X {Symbol | Object} e impostarli tramite NDC.set (String) e MDC.put (Symbol | Object, Object)

Un altro modo sarebbe quello di usa il Pattern% t, che stampa il nome del file e il numero di riga di dove è stata effettuata la chiamata.

Il compromesso tra ciascuno di questi metodi è che sono progressivamente più costosi nell'uso delle risorse della CPU. Tendo a utilizzare prima GDC per il tipo di cosa che stai chiedendo.

+0

Potresti mostrare un esempio? (Il link che hai fornito è morto) – Arafangion

Problemi correlati