Pregunta

Realmente debo estar perdiendo algo obvio, pero estoy teniendo problemas con el uso general de Log4r en mi aplicación Ruby. Soy capaz de conectarse sin ningún problema, pero la sobrecarga parece torpe la forma en que lo tengo de configuración. básicamente estoy pasando la ruta completa a un nombre de archivo para iniciar la sesión en cada clase en mi solicitud. El guión de rubí que se llama tira del archivo de registro de uno de los argumentos en ARGV que luego se pasa alrededor y puso en cada clase que llamo en rubí. En cada clase utilizo el patternFormatter para insertar el nombre de la clase / archivo en la declaración de registro.

¿Hay una mejor manera de hacer este trabajo? Se siente como si no importa lo que pienso de requerirá algo que debe ser superado para cada clase en mi solicitud de rubí. Podría establecer el archivo de registro en un archivo de configuración YAML lugar, pero entonces estaría pasando todo el archivo de configuración para cada clase también.

Cualquier consejo? Si esto no tiene sentido que pudiera tratar de publicar algunos ejemplos de código más específicos para explicar con más detalle lo que quiero decir.

Gracias!

¿Fue útil?

Solución

Hmm, ninguna razón por la cual no se crean instancias de clases Log4r::Logger al comienzo de su script y pasar alrededor de 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 se ejecuta run.rb que se obtiene:

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

y una logtest.log archivo de registro de nombre en el disco.

Otros consejos

Soy el encargado del mantenimiento de log4r,

Para los scripts individuales (diferentes archivos .RB), que podría acercarse a esto en un par de maneras diferentes (anclaje, lo sé), en primer lugar, ser conscientes de que las características que estoy cubriendo aquí están disponibles en> = 1.1.4.

Una forma sería la creación de una cadena PatternFormatter diferente para cada script (si se crea un archivo de configuración YAML o XML, puede especificar diferentes patrones en función de cada nombre de la 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 se encuentra disponible en todos los subprocesos que se ejecutan un script. Se puede utilizar al poner% g en el patrón y establecer el valor a través de GDC.set (String) para obtener información más detallada, véase: http://log4r.rubyforge.org/manual.html

NDC y MDC se anidan y cartografiado contextos de diagnóstico, respectivamente. El patrón de éstos es utilizar% xy% X {Símbolo | Object}, y para ponerlos a través de NDC.set (String) y MDC.put (Símbolo | Object, Object)

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

El compromiso entre cada uno de estos métodos es que son progresivamente más caro en el uso de recursos de la CPU. Yo tiendo a usar primero GDC para el tipo de cosas que usted está pidiendo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top