2012-07-30 9 views

Antwort

0

ein kleines Beispiel:

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) 

Während der Initialisierung Sie Erstellen Sie einen Logger (@log). In Ihren Methoden rufen Sie den Logger an.

Mit @log.level= (oder MyClass#log.level=) können Sie beeinflussen, welche Nachrichten verwendet werden.

Sie können verschiedene Ausgabegeräte verwenden (in meinem Beispiel logge ich mich in STDOUT ein). Sie können auch outputters (zB STDOUT mit Warnungen, die alle Daten (einschließlich debug) in eine Datei ...) mischen

17

Der flexibelste Ansatz für Benutzer Ihres Edelsteins ist, dass sie einen Logger bereitstellen, anstatt ihn innerhalb des Edelsteins einzurichten. In seiner einfachsten Form könnte dies

sein
class MyGem 
    class << self 
    attr_accessor :logger 
    end 
end 

Sie verwenden MyGem.logger.info "hello" dann Nachrichten aus Ihrem Juwel einzuloggen (möchten Sie vielleicht in einem Hilfsmethode umhüllen, die prüft, ob ein Logger überhaupt eingestellt ist)

Benutzer von Ihre Perle kann dann steuern, wo Nachrichten protokolliert werden (eine Datei, syslog, stdout, etc ...)

+0

Bitte beachten Sie meine Update war meine Formulierung verwirrend. Ich möchte mich korrekt in meine internen Methoden einloggen. – Kamilski81

+0

Ich bin mir nicht sicher, was du danach willst. –

+0

Vielen Dank, ich war dabei einen schrecklichen Fehler zu machen. – Gerry

-6

Ich denke, der einfachste Ansatz es auf diese Weise

Rails.logger.info "hello" 
+2

Warum nehmen Sie an, dass Rails verwendet wird? Die Frage dreht sich nur um Ruby und ein eigenes Juwel. – knut

+0

War unaufmerksam. In meinem Fall mit Rails ist es nur geholfen, so leid für Offtop. –

13

Sie halten zu verwenden ist Logger in Ihrem Top-Level-Modul. Benutzern erlauben, ihren eigenen Logger einzurichten, aber einen angemessenen Standard für diejenigen bereitzustellen, die sich nicht mit der Protokollierung befassen. Für z.B.

module MyGem 
    class << self 
    attr_writer :logger 

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

Dann können Sie überall in Ihrem Gem-Code auf den Logger zugreifen. Für z.B.

class MyGem::SomeClass 

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

end 

Referenzen:

Verwandte Themen