2012-07-30 8 views

Respuesta

0

un pequeño ejemplo:

gem 'log4r' 
require 'log4r' 

class MyClass 
    def initialize(name) 

    @log = Log4r::Logger.new(name) 
    #Add outputter 
    #~ log.outputters << Log4r::FileOutputter.new('log_file', :filename => 'mini_example.log', :level => Log4r::ALL) 
    log.outputters << Log4r::StdoutOutputter.new('log_stdout') #, :level => Log4r::WARN) 
    #~ log.outputters << Log4r::StderrOutputter.new('log_stderr', :level => Log4r::ERROR) 

    @log.level = Log4r::INFO 
    @log.info("Creation") 
    #~ @log.level = Log4r::OFF 
    end 
    attr_reader :log 
    def myfunction(*par) 
    @log.debug("myfunction is called") 
    @log.warn("myfunction: No parameter") if par.empty? 
    end 
end 

x = MyClass.new('x') 
x.myfunction 

y = MyClass.new('y') 
y.myfunction 
y.myfunction(:a) 
y.log.level = Log4r::DEBUG 
y.myfunction(:a) 

Durante la inicialización se crear un registrador (@log). En sus métodos, llama al registrador.

Con @log.level= (o MyClass#log.level=) puede influir en los mensajes que se utilizan.

Puede utilizar diferentes emisores (en mi ejemplo me conecto a STDOUT). También se puede mezclar en productores (por ejemplo STDOUT con advertencias, cada uno de los datos (incluyendo depuración) a un archivo ...)

17

El enfoque más flexible para los usuarios de su gema es permitirles proporcionar un registrador en lugar de instalarlo dentro de la gema. En su más simple que esto podría ser

class MyGem 
    class << self 
    attr_accessor :logger 
    end 
end 

A continuación, utiliza MyGem.logger.info "hello" para registrar los mensajes de su joya (es posible que desee para envolverlo en una método de utilidad que comprueba si un registrador se establece en absoluto)

usuarios de su joya a continuación, puede controlar dónde mensajes se registran en (un archivo, syslog, stdout, etc ...)

+0

favor ver mi actualización, mi redacción es confusa. Quiero iniciar sesión en mis métodos internos correctamente. – Kamilski81

+0

No estoy seguro de lo que buscas entonces. –

+0

Muchas gracias, estaba a punto de cometer un terrible error. – Gerry

-6

creo que el método más sencillo es utilizar de esta manera

Rails.logger.info "hello" 
+2

¿Por qué asumes que se usa Rails? La pregunta solo habla de Ruby y una joya propia. – knut

+0

estaba distraído. En mi caso con Rails, solo ayudó, así que lo siento por offtop. –

13

Puede mantener el registrador en su módulo de nivel superior. Permita que los usuarios configuren su propio registrador pero proporcionen un valor predeterminado razonable para aquellos que no se preocupan por el registro. Por ej.

module MyGem 
    class << self 
    attr_writer :logger 

    def logger 
     @logger ||= Logger.new($stdout).tap do |log| 
     log.progname = self.name 
     end 
    end 
    end 
end 

Luego, en cualquier lugar dentro de su código de gema puede acceder al registrador. Por ej.

class MyGem::SomeClass 

    def some_method 
    # ... 
    MyGem.logger.info 'some info' 
    end 

end 

Referencias:

Cuestiones relacionadas