2012-07-30 11 views
14

वर्तमान में मैं puts का उपयोग कर रहा हूं, लेकिन मुझे यकीन है कि यह सही उत्तर नहीं है। puts के बजाय मेरे आंतरिक लॉगिंग को आउटपुट करने के लिए, मैं अपने मणि के अंदर, लॉगर को सही ढंग से कैसे सेटअप करूं?मैं अपने रूबी मणि के अंदर सही तरीके से लॉग कैसे करूं?

उत्तर

0

एक छोटी सी उदाहरण: प्रारंभ के दौरान

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) 

आप लॉगर बनाएं (@log)। अपनी विधियों में आप लॉगर को कॉल करते हैं।

@log.level= (या MyClass#log.level=) के साथ आप प्रभावित कर सकते हैं, कौन से संदेश उपयोग किए जाते हैं।

आप विभिन्न आउटपुट का उपयोग कर सकते हैं (मेरे उदाहरण में मैं STDOUT पर लॉग इन करता हूं)। तुम भी (एक फाइल करने के लिए जैसे चेतावनी के साथ STDOUT, प्रत्येक डेटा (डीबग सहित) ...) outputters मिश्रण कर सकते हैं

17

आपके मणि के उपयोगकर्ताओं के लिए सबसे लचीला दृष्टिकोण उन्हें मणि के अंदर स्थापित करने के बजाय एक लॉगर प्रदान करने देना है। इसके सरलतम पर इस हो सकता है

class MyGem 
    class << self 
    attr_accessor :logger 
    end 
end 

फिर आप MyGem.logger.info "hello" का उपयोग अपने मणि से संदेश लॉग इन करने के

के उपयोगकर्ता (यदि आप एक उपयोगिता विधि है कि परीक्षण एक लकड़हारा सब पर सेट कर दिया जाता है कि क्या में लपेट कर सकते हैं) अपने मणि तो नियंत्रित कर सकते हैं जहां संदेशों को लॉग इन किया हो (एक फ़ाइल, syslog, stdout, आदि ...)

+0

कृपया मेरे को अपडेट हुआ, मेरे शब्दों भ्रामक था। मैं अपने आंतरिक तरीकों के अंदर सही ढंग से लॉग इन करना चाहता हूं। – Kamilski81

+0

मुझे यकीन नहीं है कि आप उसके बाद क्या कर रहे हैं। –

+0

आपको बहुत बहुत धन्यवाद, मैं एक भयानक गलती करने वाला था। – Gerry

-6

मुझे लगता है कि सबसे आसान दृष्टिकोण यह इस तरह से

Rails.logger.info "hello" 
उपयोग करने के लिए
+2

आप क्यों मानते हैं कि रेल का उपयोग किया जाता है? प्रश्न केवल रूबी और अपने मणि के बारे में बात करता है। – knut

+0

व्यर्थ था। रेल के साथ मेरे मामले में यह सिर्फ मदद की है, तो ऑफटॉप के लिए खेद है। –

13

आप रख सकते है अपने शीर्ष-स्तर मॉड्यूल में लॉगर। उपयोगकर्ता को अपना लॉगर सेट करने दें, लेकिन उन लोगों के लिए उचित डिफ़ॉल्ट प्रदान करें जो लॉगिंग से निपटने की परवाह नहीं करते हैं। उदाहरण के लिए

module MyGem 
    class << self 
    attr_writer :logger 

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

फिर, आपके मणि कोड के भीतर कहीं भी आप लॉगर तक पहुंच सकते हैं। उदाहरण के लिए

class MyGem::SomeClass 

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

end 

संदर्भ:

संबंधित मुद्दे