2010-03-18 14 views
7

Realmente me falta algo obvio, pero estoy teniendo problemas con el uso general de Log4r en mi aplicación Ruby. Puedo iniciar sesión sin problemas, pero la sobrecarga parece torpe como lo tengo configurado. Básicamente estoy pasando la ruta completa a un nombre de archivo para iniciar sesión en cada clase en mi aplicación. La secuencia de comandos de ruby ​​que se llama extrae el archivo de registro de uno de los argumentos en ARGV que luego se pasa y se establece en cada clase que llamo en ruby. En cada clase utilizo patternFormatter para insertar el nombre de clase/archivo en la declaración de registro.Usar correctamente Log4r en la aplicación Ruby

¿Hay alguna manera mejor de hacer que esto funcione? Siento que no importa lo que yo piense requerirá que se pase algo a cada clase en mi aplicación Ruby. Podría establecer el archivo de registro en un archivo de configuración yaml, pero también pasaría el archivo de configuración a cada clase.

¿Algún consejo? Si esto no tiene sentido, podría intentar publicar muestras de código más específicas para explicar mejor lo que quiero decir.

Gracias!

Respuesta

12

Hmm, ¿por qué no crea una instancia de la clase Log4r::Logger al comienzo de la secuencia de comandos y pasa la instancia? Ni siquiera tiene que pasar a su alrededor, siempre se puede obtener por el nombre de la clase Logger:

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 

y cuando ejecutar run.rb que se obtiene:

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

y un archivo de registro denominado logtest.log en el disco.

+0

Parece que no puedo hacer que funcione. La llamada a Logger ['mylog'] en otro archivo .rb devuelve nil. – Spencer

+0

¿Y cómo le diría a Logger qué archivo cerrar la sesión? – Spencer

+0

Eche un vistazo al ejemplo actualizado arriba. ¿A qué te refieres cuando dices "otro archivo .rb"? –

13

Soy el encargado del mantenimiento de log4r,

Para los scripts individuales (diferentes archivos .RB), que podría acercarse a esto en varias formas diferentes (anclaje, lo sé), en primer lugar, tener en cuenta que las características I Estoy cubriendo aquí están disponibles en> = 1.1.4.

Una forma sería establecer una cadena PatternFormatter diferente por script (si crea un archivo de configuración yaml o xml, puede especificar diferentes patrones por nombre de clase).

Otra forma sería usar uno de GDC, NDC o MDC en un PatternFormatter.

GDC establecerá un "Contexto global de diagnóstico", es decir, es un valor que está disponible en todos los hilos que ejecutan un script. Puede usarlo poniendo% g en el patrón y estableciendo el valor a través de GDC.set (String) para obtener información más detallada, consulte: http://log4r.rubyforge.org/manual.html

NDC y MDC son contextos de diagnóstico anidados y asignados, respectivamente. El patrón para estos es usar% x y% X {Symbol | Object}, y establecerlos mediante NDC.set (String) y MDC.put (Symbol | Object, Object)

Sin embargo, otra forma sería use el Patrón% t, que imprime el nombre de archivo y el número de línea de donde se realizó la llamada.

La compensación entre cada uno de estos métodos es que son cada vez más caros en el uso de recursos de la CPU. Tiendo a usar primero GDC para el tipo de cosas que estás pidiendo.

+0

¿Podría mostrar un ejemplo? (El enlace que ha proporcionado está muerto) – Arafangion

Cuestiones relacionadas