2011-03-21 15 views
12

क्या प्रत्येक रूचि के बाद मानक रूबी लॉगर (यानी ::Logger) ऑटो-फ्लश के लिए यह संभव है?मानक रूबी लॉगर प्रत्येक संदेश के बाद फ्लश करने के लिए कॉन्फ़िगर किया जा सकता है?

अद्यतन: मैं प्रति How to get timestamps in your ruby on rails logs के रूप में, एक कस्टम लॉग फ़ॉर्मेटर की स्थापना कर रहा हूँ:

def initialize(params = {}) 
    Rails.logger.auto_flushing = 1 
    @logger = Logger.new $stdout 
    @logger.formatter = LogFormatter.new 
    @logger.level = params.include?(:log) ? params[:log] : Logger::INFO 
    end 

लेकिन कोई पासा:

class Foo 
    def initialize(params = {}) 
    @logger = Logger.new $stdout 
    @logger.formatter = LogFormatter.new 
    @logger.level = params.include?(:log) ? params[:log] : Logger::INFO 
    # ... 
    end 

    class LogFormatter < Logger::Formatter 
    def call(severity, time, progname, message) 
     timestamp = time.iso8601 
     log_msg = "#{timestamp}#{" [#{severity}]" if %w{ERROR WARN}.include? severity} " 
     if message.is_a? Exception 
     log_msg += "#{message.message}" 
     log_msg += ": #{message.backtrace.join "\n#{timestamp} "}" unless message.backtrace.blank? 
     else 
     log_msg += message 
     end 

     "#{log_msg}\n" 
    end 
    end 
end 

मैं इस प्रकार idlefingers से सुझाव का उपयोग करने की कोशिश की। न तो @logger.auto_flushing = 1 मेरे लिए काम करता है। मैं क्या गलत कर रहा हूं?

अद्यतन: ऐसा लगता है कि ActiveSupport के ::Logger बस मानक रूबी ::Logger गिर्द घूमती है। तो मेरा सवाल रूबी के बारे में और रेल नहीं है, आखिरकार।

उत्तर

23

बाहर कर देता है यह अंतर्निहित आईओ वस्तु की sync विशेषता को चालू करने का मामला था:

def initialize(params = {}) 
    $stdout.sync = true unless RAILS_ENV == 'production' 
    @logger = Logger.new $stdout 
    @logger.formatter = LogFormatter.new 
    @logger.level = params.include?(:log) ? params[:log] : Logger::INFO 
    end 
3

सेट ActiveSupport::BufferedLogger.auto_flushing अपने वातावरण में इतनी तरह:

Rails.logger.auto_flushing = 1 

यह बात हर संदेश के बाद फ्लश बनाना चाहिए।

+0

मेरे लिए काम नहीं करता है (सवाल का मेरे अद्यतन देखें)। –

+0

यह रेल लॉगर (और आपका मूल प्रश्न) से बिल्कुल अलग है। मैं अपने सिर के शीर्ष से निश्चित नहीं हूं कि stdout का उपयोग कर कस्टम लॉग के साथ ऐसा कैसे करें। फ़ाइल लॉगिंग के लिए आप [io.sync = true] (http://www.ruby-doc.org/core/classes/IO.html#M000911) का उपयोग कर सकते हैं, लेकिन आपको इसे stdout लॉगिंग के लिए Google करना होगा। – idlefingers

+0

आह, ठीक है। मैंने सोचा कि लॉगर * मानक रेल लॉगर था। : -/ –

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

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