Tenemos el código para registrar datos en nuestra aplicación web Ruby 1.8.6. Usted lo llama más o menos de la siguiente manera:Obtener el módulo de la persona que llama en Ruby
$log.info("Some text here")
Ahora, en la salida conectado, me gustaría incluir el módulo en el que apareció esa línea. Sé que el Kernel#caller
me dará una matriz en la que puedo extraer el archivo y el número de línea en que se produjo la línea de registro, pero no quiero eso. Quiero el módulo, no el nombre del archivo. La solución obvia es modificar la línea de registro de manera que se lee como:
$log.info("Some text here", self.class.name)
y luego analizar el resultado. Sin embargo, eso no va a funcionar, porque estoy tratando de extraer esta información en el caso predeterminado. Es decir, necesito que la solución funcione si el programador olvidó especificar el módulo, el segundo parámetro para la línea de registro.
¿Hay alguna manera de hacer esto? De lo contrario, tendré que conformarme con la matriz caller
; la mayoría de nuestros módulos están en directorios separados, por lo que esta sería una solución al 80%.
más completo ejemplo, disculpen los errores sintácticos mínimos:
en log.rb archivo:
module Log
class Logger
def info(msg, mod = '')
puts "Module: #{mod} Msg: #{msg}"
end
end # class Logger
end # module Log
$log = Log::Logger.new
en foo.rb archivo:
module Foo
class Bar
def do_something
# Do not pass in self.class.name.
# We want the output to look like:
# Module: Foo Msg: I did something!
$log.info "I did something!"
end
end # class Bar
end #module Foo
No veo cómo puede hacerlo, a menos que pase 'self' o' binding' al objeto logger. Tendría que analizar el archivo con la información de 'calller', que estoy seguro que no desea hacer. –