2013-02-11 34 views
7

मैं लॉगिंग मैं प्रवेश मणि का उपयोग करने के लिए आदेश में गहरे लाल रंग का 1.9.2p180 (2011-02-18 संशोधन 30909)रूबी: लॉगर और डेमॉन

उपयोग कर रहा हूँ। मेरे कार्यक्रम में दो ब्लॉक हैं, जिन्हें डेमॉन के रूप में उपयोग किया जाता है।

लेकिन एक त्रुटि और कुछ भी नहीं में इन ब्लॉकों परिणामों से प्रवेश करने लॉगफ़ाइल को लिखा है:

log shifting failed. closed stream 
log writing failed. closed stream 

यहाँ कोड में होता है:

log = Logger.new(logbase + 'logfile.log', 'monthly') 
log.level = Logger::INFO 

proc = Daemons.call(options) do 
    # [...] 
    log.info "Any Logmessage" 
    # [...] 
end 

कोई आइडिया, वहाँ क्या गलत?

उत्तर

8

Daemons मणि सभी फ़ाइल वर्णनकर्ताओं को बंद करता है जब यह प्रक्रिया को समाप्त करता है। इसलिए डेमन्स ब्लॉक से पहले खोले गए किसी भी लॉगफाइल को फोर्क प्रक्रिया के अंदर बंद कर दिया जाएगा।

और चूंकि आप बंद फ़ाइल वर्णनकर्ताओं -> त्रुटियों को नहीं लिख सकते हैं।

आप क्या होता है के बारे में और अधिक पढ़ सकते हैं जब आप अध्याय पढ़ कर एक प्रक्रिया daemonize:

क्या डेमॉन आंतरिक रूप से मेरी डेमॉन के साथ क्या करता है?
http://daemons.rubyforge.org/Daemons.html

समाधान डेमॉन ब्लॉक के बजाय इसके बाहर के अंदर लॉगफ़ाइल को खोलने के लिए है। इसे ठीक करना चाहिए। लेकिन ध्यान दें कि डिमनीकरण कार्यशील निर्देशिका को / में बदलता है, इसलिए लॉगफाइल पथों का संदर्भ देते समय इसे ध्यान में रखें।

+0

कि मदद की। आपका बहुत बहुत धन्यवाद। – Dakkar

2

एक समाधान जो सफलतापूर्वक देरी_job मणि में काम करता है, में फोर्क से पहले सभी खुली फ़ाइलों को निकालने, और बाद में उन्हें फिर से खोलना शामिल है।

एक समायोजित निकालने from delayed_job:

@files_to_reopen = [] 
ObjectSpace.each_object(File) do |file| 
    @files_to_reopen << file unless file.closed? 
end 

Daemons.run_proc('some_process') do 
    @files_to_reopen.each do |file| 
    file.reopen file.path, 'a+' 
    file.sync = true 
    end 

    # Your code 
end