7

मैं अपनी देरी_job प्रक्रिया से संदेश लॉग नहीं कर सकता। यहां नौकरी चल रही है।देरी_job लॉगिंग नहीं

class MyJob 
    def initialize(blahblah) 
    @blahblah = blahblah 
    @logger = Logger.new(File.join(Rails.root, 'log', 'delayed_job.log')) 
    end 
    def perform 
    @logger.add Logger::INFO, "logging from delayed_job" 
    #do stuff 
    end 
end 

मैं विभिन्न प्रवेश के स्तर की कोशिश की है, और मैं config.log_level = है: मेरे पर्यावरण विन्यास में डिबग। मैं monit से delayed_job चलाते हैं। मैं rubed_job 3.0.1 रूबी 1.9.3 और रेल 3.0.10 के साथ उपयोग कर रहा हूँ।

+0

एक विचार होगा कि यह परस्पर विरोधी है, क्योंकि delayed_job रूप में अच्छी तरह इस लॉग फ़ाइल उपयोग कर रहा है। क्या आपने दूसरा नाम प्रयोग किया? – iltempo

+0

मैंने एक अलग नाम की कोशिश की। नई लॉग फ़ाइल बनाई गई है लेकिन इसमें कुछ भी लॉग नहीं है। – freedrull

उत्तर

16

एक स्पष्टीकरण यह हो सकता है कि नौकरी निर्माता पक्ष पर केवल एक बार शुरू हो जाए। फिर यह धारावाहिक हो जाता है, कतार के माध्यम से वितरित किया जाता है (उदाहरण के लिए डेटाबेस) और कार्यकर्ता में unserialized। लेकिन कार्यकर्ता प्रक्रिया में प्रारंभिक विधि को फिर से नहीं बुलाया जा रहा है। केवल प्रदर्शन विधि को भेजने के माध्यम से बुलाया जाता है।

हालांकि आप लॉग फ़ाइल में लिखने के लिए कार्यकर्ताओं लकड़हारा का पुन: उपयोग कर सकते हैं:

class MyJob 
    def perform 
    say "performing like hell" 
    end 

    def say(text) 
    Delayed::Worker.logger.add(Logger::INFO, text) 
    end 
end 

कार्यकर्ताओं को पुनः आरंभ करने मत भूलना।

+0

यह विधि मेरे लिए काम किया। धन्यवाद! – freedrull

+1

मुझे यह मिल रहा है "TestJob NoMethodError के साथ विफल: शून्य के लिए अपरिभाषित विधि 'जोड़ें': NilClass"। रघुस के जवाब ने तय किया कि। – idrinkpabst

3

मुझे नहीं पता कि आप नौकरी में लॉगर क्यों सेट करेंगे। जब मैंने ऐसा किया है तो मैंने कार्यकर्ता को प्रारंभ पर एक विशिष्ट फ़ाइल का उपयोग करने के लिए सेट किया है उदा। Logger.new("log/worker_#{worker_number}") जो यह सुनिश्चित करता है कि प्रत्येक कार्यकर्ता अपनी फ़ाइल में आउटपुट करता है और आपको एक ही समय में एक ही फाइल (गन्दा) पर लिखने वाले एकाधिक श्रमिकों के बारे में चिंता करने की आवश्यकता नहीं है।

इसके अलावा, सादे ओल रूबी में आप @logger.info "logging from delayed_job" पर कॉल कर सकते हैं।

अंत में, मैं बहुत यकीन है कि 'प्रदर्शन' अपने कार्यकर्ता द्वारा सीधे फोन किया और instantiated है हूँ, इसलिए आप के लिए refactor कर सकते हैं:

class MyJob 
def perform(blahblah) 
    @logger.add Logger::INFO, "logging from delayed_job" 
    @blahblah = blahblah 
    #do stuff 
end 
end 
+0

मैं वास्तव में इस तरह से प्रतिक्रिया करने में सक्षम नहीं था, मुझे नहीं लगता कि प्रदर्शन कोई तर्क लेता है। पिछले जवाब के बाद से मैंने आपकी लॉगिंग विधि का प्रयास नहीं किया, लेकिन मेरा मानना ​​है कि मुझे पहले कोशिश करना याद है और यह काम नहीं करता है। – freedrull

+0

हालांकि आप सही हैं, मुझे लॉगर को प्रारंभिक में या नौकरी में स्थापित करने के बजाय कुछ सेट करना चाहिए। – freedrull

10

RAILS_ROOT/config/initializers में एक फ़ाइल delayed_job_config.rb कहा जाता है इन पंक्तियों के साथ:

Delayed::Worker.logger = Rails.logger 
Delayed::Worker.logger.auto_flushing = true 

ऐसा करने के बाद अपने कर्मचारियों को फिर से शुरू करना याद रखें।

मुझे पता है कि अगर यह

+0

'auto_flushing' को रेल 3 में बहिष्कृत किया गया था और ऐसा लगता है कि बाद के संस्करणों में हटा दिया गया है –

0

यह मेरे लिए ठीक काम कर रहा है में मदद करता है रेल 3.2 में करते हैं:

class FiveMinuteAggregateJob < Struct.new(:link, :timestamp) 
    def perform 
    Rails.logger.info 'yup.' 
    end 
end 
संबंधित मुद्दे