2011-12-18 11 views
5

यह स्क्रिप्ट o.rb नाम है:STDOUT को लॉगर आउटपुट फ़ाइलों पर रीडायरेक्ट क्यों नहीं किया जाता है?

@logger = Logger.new(STDOUT) 
@logger.info "start_time : #{start_time}" 

जब मैं ./o.rb का उपयोग कर इसे चलाने के लिए, कंसोल पर उत्पादन सही है।
हालांकि, जब मैंने ./o.rb > log.txt 2>&1 की कोशिश की, तो लॉग फ़ाइल खाली है!
ऐसा क्यों हुआ?

सरल puts फ़ंक्शन का उपयोग करते समय मुझे एक ही समस्या है।


अद्यतन

यह इस समस्या को पुनः होगा:

require 'logger' 

logger = Logger.new(STDOUT) 

loop do 
    logger.info "This is a test haha" 
    sleep(1) 
end 

जब मैं ./foo.rb का उपयोग कर इसे चलाने के लिए, यह सांत्वना उत्पादन के लिए सही ढंग से लिखते हैं।

जब मैं ./foo.rb > log.txt चलाता हूं, मुझे कुछ भी नहीं मिलता है।

इसके अलावा, जब मैं ./foo.rb | tee log.txt का उपयोग करता हूं, तो कंसोल पर कुछ भी नहीं लिखा जाता है और लॉग फ़ाइल खाली होती है।

log.txt फ़ाइल बनाई गई थी लेकिन खाली बनी हुई है।

मेरा रूबी संस्करण 1.8.7 है।

+0

मेरे लिए काम करता है ... – sarnold

+0

मेरा प्रोग्राम 1 दिन तक चल रहा है, क्या यह फाइल बफर के कारण नहीं है? अभी मैं एक साधारण स्क्रिप्ट लिखता हूं जो केवल एक वाक्य आउटपुट करता है और प्रोग्राम से बाहर निकलता है, यह काम करता है। – nttstar

+0

मुझे नहीं लगता कि यह बफरिंग है; ['लॉगडिवाइस :: नया'] (http://www.ruby-doc.org/stdlib-1.9.3/libdoc/logger/rdoc/Logger/LogDevice.html#method-c-new) कॉल [' @dev .sync = true'] (http://www.ruby-doc.org/core-1.9.3/IO.html#method-i-sync-3D) - जो अनबफर किए गए ऑपरेशन के लिए पूछता है। – sarnold

उत्तर

11

यह एक बफरिंग समस्या है, आप मानक आउटपुट को सिंक करने के लिए सेट कर सकते हैं और इसे हल करना चाहिए।

#!/usr/bin/env ruby 

require 'logger' 

$stdout.sync = true 
logger = Logger.new($stdout) 

loop do 
    logger.info "This is a test haha" 
    sleep 1 
end 
+0

यह काम करता है। लेकिन कंसोल को आउटपुट करने के लिए इस समस्या (रीडायरेक्ट किए बिना) नहीं है? – nttstar

+1

सुनिश्चित नहीं है कि मानक आउटपुट टीटी नहीं होने पर बैश को फ़ाइल डिस्क्रिप्टर को बफर करना होगा। –

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