2012-07-30 9 views

Odpowiedz

0

trochę przykład:

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) 

Podczas inicjalizacji ty utwórz rejestrator (@log). W twoich metodach nazywasz logger.

Dzięki @log.level= (lub MyClass#log.level=) możesz wpływać na to, które wiadomości są używane.

Możesz użyć różnych programów wyjściowych (w moim przykładzie loguję do STDOUT). Można również mieszać outputters (np STDOUT z ostrzeżeniami, każde dane (w tym debug) do pliku ...)

17

Najbardziej elastyczne podejście dla użytkowników klejnotów polega na umożliwieniu im dostarczenia rejestratora zamiast instalowania go wewnątrz klejnotu. W najprostszej może to być

class MyGem 
    class << self 
    attr_accessor :logger 
    end 
end 

wtedy użyć MyGem.logger.info "hello" do wiadomości dziennika z klejnot (warto zawinąć go w metodzie narzędzie, które sprawdza, czy rejestrator jest ustawiony w ogóle)

Użytkownicy Twój gem można następnie kontrolować, gdzie wiadomości się zalogować do (pliku, syslog, stdout, etc ...)

+0

Proszę zobaczyć moje aktualizację, moje sformułowanie było mylące. Chcę poprawnie zalogować się do moich wewnętrznych metod. – Kamilski81

+0

Nie jestem pewien, o co w tym momencie chodzi. –

+0

Dziękuję bardzo, miałem zamiar popełnić okropny błąd. – Gerry

-6

Myślę, że najprostszym sposobem jest użycie go w ten sposób

Rails.logger.info "hello" 
+2

Dlaczego zakładasz, że Rails jest używany? Pytanie mówi tylko o Rubim i własnym klejnocie. – knut

+0

Był nieuważny. W moim przypadku z Railsami to pomogło, więc przepraszam za offtop. –

13

można zachować rejestrator w swoim module najwyższego poziomu. Zezwól użytkownikowi na ustawienie własnego rejestratora, ale zapewnia rozsądne ustawienie domyślne dla tych, którzy nie dbają o rejestrację. Dla np.

module MyGem 
    class << self 
    attr_writer :logger 

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

Następnie, w dowolnym miejscu w obrębie kodu gem można uzyskać dostęp do rejestratora. Dla np.

class MyGem::SomeClass 

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

end 

Referencje:

Powiązane problemy