2012-07-30 16 views

risposta

0

una piccola premessa:

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 l'inizializzazione si crea un logger (@log). Nei tuoi metodi chiami il registratore.

Con @log.level= (o MyClass#log.level=) è possibile influenzare quali messaggi vengono utilizzati.

È possibile utilizzare diversi outputter (nel mio esempio accedo a STDOUT). Si può anche mescolare outputters (ad esempio STDOUT con avvisi, ognuno dei dati (compresi debug) in un file ...)

17

L'approccio più flessibile per gli utenti della tua gemma è di consentire loro di fornire un logger piuttosto che configurarlo all'interno della gemma. Nel caso più semplice questo potrebbe essere

class MyGem 
    class << self 
    attr_accessor :logger 
    end 
end 

È quindi utilizzare MyGem.logger.info "hello" per registrare i messaggi dal vostro gioiello (si potrebbe desiderare di avvolgerlo in un metodo di utilità che verifica se un registratore viene impostato a tutti)

Gli utenti di il vostro gioiello può quindi controllare in cui i messaggi vengono registrati a (un file, syslog, stdout, ecc ...)

+0

Si prega di vedere il mio aggiornamento, il mio testo era confusa. Voglio accedere correttamente ai miei metodi interni. – Kamilski81

+0

Allora non sono sicuro di cosa stai cercando. –

+0

Grazie mille, stavo per fare un errore orribile. – Gerry

-6

penso che l'approccio più semplice è quello di utilizzare in questo modo

Rails.logger.info "hello" 
+2

Perché presumi che Rails sia usato? La domanda parla solo di Ruby e di una sua gemma. – knut

+0

Non è stato attivato. Nel mio caso con Rails è appena stato aiutato, mi dispiace per Offtop. –

13

È possibile mantenere il logger nel tuo modulo di primo livello. Permetti agli utenti di impostare il proprio logger, ma fornire un valore predefinito ragionevole per coloro che non si preoccupano di gestire la registrazione. Ad es.

module MyGem 
    class << self 
    attr_writer :logger 

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

Poi, ovunque all'interno del codice gemma è possibile accedere al data logger. Ad es.

class MyGem::SomeClass 

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

end 

Riferimenti:

Problemi correlati