2009-11-10 19 views
5

0 रूबी में इस समय एक प्रोजेक्ट लिख रहा है जो डेटाबेस इंटरैक्शन के लिए ActiveRecord मणि का उपयोग करता है और मैं निम्नलिखित कोड विशेषता का उपयोग कर सभी डेटाबेस गतिविधि लॉग इन करने का प्रयास कर रहा हूंरूबी डेमॉन ActiveRecord लॉगर IOError

ActiveRecord::Base.logger = Logger.new(File.open('logs/database.log', 'a')) 

यह माइग्रेशन आदि लेकिन (जो किसी कारण से, क्योंकि यह एक NilClass त्रुटि जब यह अक्षम है देता है सक्रिय किया कि प्रवेश की आवश्यकता प्रतीत) के लिए ठीक काम करता है जब मैं परियोजना है जो एक लड़ी डेमॉन ActiveRecord बुला शामिल चलाने का प्रयास ऑब्जेक्ट को निम्न त्रुटि

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/logger.rb:504:in `write': closed stream (IOError) 
के साथ विफल रहता है

इस समस्या को हल करने के तरीके पर कोई भी विचार बहुत सराहना की जाएगी। क्षण के लिए मैं अन्य कोड के माध्यम से देखने के लिए अगर लोगों को एक और अधिक धागे की सुरक्षित तरीके से ActiveRecord लॉगिंग को लागू करने

धन्यवाद

पैट्रिक

उत्तर

1

के अन्य तरीके हैं देखने के लिए ऐसा नहीं है कि पता चला है माइग्रेशन के लिए शुरू कर दिया है ActiveRecord::Base.logger वर्चुअल काम करने के लिए शून्य नहीं हो सकता है, जो समस्या के पहले भाग को बताता है। मैं अभी तक IOError को ठीक करने में असमर्थ हूं, हालांकि जब STDERR की बजाय फ़ाइल का उपयोग किया जाता है।

+0

में फिर से खोलना चाहेंगे तुल्यकालन से समस्या स्टेम? क्या आप इसके बजाए रेल 'BufferedLogger का उपयोग कर सकते हैं, और देखें कि क्या समस्या ठीक हुई है? –

+0

हमने डीआरबी का उपयोग करके हमारी ज़रूरतों के लिए एक सरल लॉगिंग एप्लिकेशन लिखना समाप्त कर दिया है, जो हमारे सभी धागे –

4

मैं एक ही मुद्दे में भाग गया। आपको पहले डिमननाइज़ करना होगा, और फिर रेल वातावरण लोड करें।

+0

के लिए त्रुटियों को संभाला है, क्या आप समझ सकते हैं कि "डिमननाइजेशन और फिर रेल्स एनवी लोड करें" –

+0

Daemons.run_proc ('your_daemon', daemon_options) {आवश्यकताएं File.expand_path (File.join (File.dirname (__ FILE__), '..', 'config', 'environment')) # do stuff} –

+0

@LoganKoester ध्यान दें कि '__FILE__' पर डीआईआर जानकारी प्राप्त करने का प्रयास नहीं किया जाएगा काम करने के बाद काम करें, क्योंकि प्रक्रिया इस जानकारी को खो देती है। आपको deemonizing से पहले उस पथ को सहेजना होगा। – Kelvin

4

delayed_job डेमॉन और ActiveRecord, daemonize से पहले का इस्तेमाल किया है, फ़ाइलें opend है मिलता है, और फिर daemonize

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

Daemons.run_proc("xxxxx_name",:dir=>pid_file,:dir_mode=>:normal) do 
    Dir.chdir(Rails.root) 
    # Re-open file handles 
    @files_to_reopen.each do |file| 
    begin 
     file.reopen file.path 
     file.sync = true 
    rescue ::Exception 
    end 
    end 
end 
+1

वे lib/delayed/command.rb – m33lky

+0

में कुछ ऐसा करते हैं जो लेखन अनुमति जोड़ने के लिए मत भूलना। 'file.reopen file.path, "a" ' – Phil

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