2009-10-21 18 views
7

मुझे एक रेल एप्लिकेशन मिला है जिसमें कुछ छोटी संख्या में महत्वपूर्ण गणना समय की आवश्यकता होती है। पृष्ठभूमि कार्यों के रूप में इन कार्यों को प्रबंधित करने की जटिलता को पार करने के बजाय, मैंने पाया है कि मैं प्रसंस्करण को कई धागे में विभाजित कर सकता हूं और एक मल्टीकोर सेवर के साथ जेआरबीई का उपयोग करके, मैं यह सुनिश्चित कर सकता हूं कि सभी धागे उचित समय में पूर्ण हो जाएं। (ग्राहक ने पृष्ठभूमि में इस दृष्टिकोण बनाम चल रहे कार्यों को रखने में पहले से ही एक मजबूत रुचि व्यक्त की है।)रेल अनुप्रयोग में धागे के अंदर लॉगिंग

समस्या यह है कि रेल लॉगजर को लिखना इन धागे के भीतर काम नहीं करता है। लॉग फ़ाइल में कुछ भी नहीं दिखता है। मुझे इस समस्या के कुछ संदर्भ मिले लेकिन कोई समाधान नहीं मिला। मुझे डिबगिंग में मदद के लिए मेरे कोड में डाल डालने पर कोई फर्क नहीं पड़ता है लेकिन ग्लासफ़िश मणि ऐप सर्वर द्वारा स्टडआउट खाया जाता है।

क्या किसी ने हर बार एक नया लॉग बनाने के बिना रेल रूबी धागे के अंदर लॉगिंग सफलतापूर्वक की है?

+0

अद्यतन: मैंने पाया कि थ्रेड में रखता है ग्लासफ़िश लॉग फ़ाइल में दिखाई देता है। मुझे यकीन नहीं है कि मैंने इसे पहले क्यों नहीं देखा; मैंने मूल रूप से इसे किसी अन्य (गैर-मुख्य) थ्रेड द्वारा उत्पन्न धागे में परीक्षण किया होगा। वैसे भी, डिबगिंग उद्देश्यों के लिए, मैं लॉग फ़ाइल में STDOUT को लिख रहा हूं इसलिए मैं खुश हूं। –

उत्तर

4

मैं एक ही समस्या के साथ अपने सिर को खरोंच कर रहा था। मेरे लिए उत्तर निम्नानुसार था:

Thread.new do 
    begin 
    ... 
    ensure 
    Rails.logger.flush 
    end 
end 
+0

अच्छा लग रहा है! धन्यवाद! –

+0

ईएम का उपयोग करके मेरे लिए काम नहीं करता है – skrat

0

मैं पृष्ठभूमि कार्यों के बारे में आपकी चिंताओं को समझता हूं, लेकिन याद रखें कि रेल में थ्रेड को कताई करना एक डरावनी चीज हो सकता है। ढांचा मल्टीथ्रेडिंग के लिए कोई प्रावधान नहीं करता है, जिसका मतलब है कि आपको सभी रेल वस्तुओं को थ्रेड-सुरक्षित नहीं माना जाता है। यहां तक ​​कि डेटाबेस कनेक्शन भी मुश्किल हो जाता है।

लॉगर के लिए: मानक रूबी लॉगर क्लास थ्रेड सुरक्षित होना चाहिए। लेकिन यदि रेल इसका उपयोग करते हैं, तो आपके पास रेल ऐप क्या कर रहा है इस पर आपका कोई नियंत्रण नहीं है। उदाहरण के लिए बेंचमार्किंग तंत्र स्तर को स्विच करके लॉगर को "चुप्पी" करेगा।

मैं रेल लॉगजर का उपयोग करने से बचूंगा। यदि आप धागे का उपयोग करना चाहते हैं, तो थ्रेड के अंदर एक नया लॉगर बनाएं जो उस ऑपरेशन के संदेशों को लॉग करता है। यदि आप प्रत्येक थ्रेड के लिए कोई नया लॉग नहीं बनाना चाहते हैं, तो आप अपने रनटाइम में एक थ्रेड-सुरक्षित लॉगिंग ऑब्जेक्ट बनाने का भी प्रयास कर सकते हैं, जिसमें प्रत्येक थ्रेड एक्सेस कर सकते हैं।

आपकी जगह में शायद पृष्ठभूमि पृष्ठभूमि समाधानों पर एक और नज़र डालें। जबकि डीआरबी एक दुःस्वप्न की तरह दिखता है, "बीजे" अच्छा और आसान लगता है; हालांकि इसे JRuby के साथ चलाने के लिए कुछ काम की आवश्यकता थी। JRuby से जावा शेड्यूलर का उपयोग करने का विकल्प भी है, http://www.jkraemer.net/2008/1/12/job-scheduling-with-jruby-and-rails

+0

जानकारी और सुझावों के लिए धन्यवाद, लेकिन इस बिंदु पर मैं थ्रेडिंग दृष्टिकोण के साथ रहूंगा क्योंकि यह लॉगिंग के अलावा ठीक काम कर रहा है। मैं किसी भी धागे में किसी भी संदिग्ध रत्न/प्लगइन्स का उपयोग नहीं कर रहा हूं और मैं दौड़ की स्थिति को रोकने के लिए म्यूटेक्स का उपयोग करने के बारे में सावधान हूं। रेल लॉगर का उपयोग करने में मेरी दिलचस्पी बस डिबगिंग की आसानी थी और मैं केवल थ्रेड का उपयोग कर उसमें घूमने में कामयाब रहा हूं अगर JRUBY_VERSION परिभाषित किया गया है और अन्यथा क्रमशः एक ही कोड चला रहा है। फिर भी धन्यवाद! –

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