2010-11-11 15 views
5

मैं अपने होमग्राउन कार्य कतार प्रणाली को एक सेलेरी-आधारित कार्य कतार में परिवर्तित करना चाहता हूं, लेकिन वर्तमान में एक सुविधा में मुझे कुछ परेशानी हो रही है।सेलरी कार्यों की एक श्रृंखला के निष्पादन के दौरान उत्पन्न किए गए सभी पायथन लॉग रिकॉर्ड कैप्चर कैसे कर सकते हैं?

अभी, मेरी कार्य कतार बहुत ही कम चलती है; मैं नौकरी चलाता हूं (जो डेटा उत्पन्न करता है और इसे किसी अन्य सर्वर पर अपलोड करता है), नाक की लॉग कैप्चर लाइब्रेरी पर एक संस्करण का उपयोग करके लॉगिंग एकत्र करें, और फिर मैं कार्य डेटाबेस में विस्तृत परिणाम रिकॉर्ड के रूप में कार्य के लिए लॉगिंग संग्रहीत करता हूं।

मैं तीन कार्यों के रूप में इस तोड़ने के लिए करना चाहते हैं:

  1. डेटा एकत्र
  2. अपलोड डेटा
  3. रिपोर्ट परिणाम (सभी पूर्ववर्ती दो कार्यों से प्रवेश करने सहित)

असली किकर यहां लॉगिंग संग्रह है। अभी, लॉग कैप्चर का उपयोग करके, मेरे पास डेटा पीढ़ी और अपलोड प्रक्रिया के दौरान किए गए प्रत्येक लॉग कॉल के लिए लॉग रिकॉर्ड की एक श्रृंखला है। इन्हें नैदानिक ​​उद्देश्यों के लिए आवश्यक है। यह देखते हुए कि कार्यों को एक ही प्रक्रिया में चलाने की भी गारंटी नहीं है, यह स्पष्ट नहीं है कि मैं इसे सेलेरी कार्य कतार में कैसे पूरा करूंगा।

इस समस्या का मेरे आदर्श समाधान पूर्ववर्ती कार्य के दौरान सभी प्रवेश पर कब्जा करने का एक तुच्छ और आदर्श न्यूनतम इनवेसिव विधि हो जाएगा (1, 2) और यह संवाददाता कार्य के लिए उपलब्ध बनाने (3)

मैं सबसे अच्छा हूँ मेरी कार्य परिभाषा के साथ काफी मोटे अनाज से बाहर, और इस काम को एक कार्य में डाल दिया? या अंत में इसे इकट्ठा करने के लिए मौजूदा कब्जे वाले लॉगिंग को पास करने का कोई तरीका है?

उत्तर

0

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

0

Django Sentry पायथन (और Django) के लिए एक लॉगिंग उपयोगिता है, और Celery के लिए समर्थन है।

1

मुझे लगता है कि आप logging मॉड्यूल का उपयोग कर रहे हैं। आप नौकरी करने के लिए प्रति कार्य सेट अलग नाम लॉगर का उपयोग कर सकते हैं। वे ऊपरी स्तर से सभी विन्यास का वारिस करेंगे।

task.py में

:

import logging 

@task 
step1(*args, **kwargs): 
    # `key` is some unique identifier common for a piece of data in all steps of processing 
    logger = logging.getLogger("myapp.tasks.processing.%s"%key) 
    # ... 
    logger.info(...) # log something 

@task 
step2(*args, **kwargs): 
    logger = logging.getLogger("myapp.tasks.processing.%s"%key) 
    # ... 
    logger.info(...) # log something 

यहाँ, सभी रिकॉर्ड एक ही नाम दिया लकड़हारा के लिए भेजा गया। नाम है कि लकड़हारा नाम पर निर्भर करता है के साथ

  1. कॉन्फ़िगर फ़ाइल श्रोता: अब, आप उन रिकॉर्ड लाने के लिए 2 तरीकों का उपयोग कर सकते हैं। अंतिम चरण के बाद, बस उस फ़ाइल से सभी जानकारी पढ़ें। सुनिश्चित करें कि इस श्रोता के लिए आउटपुट बफरिंग अक्षम है या आप रिकॉर्ड खोने का जोखिम उठाते हैं।

  2. कस्टम श्रोता बनाएं जो स्मृति में रिकॉर्ड्स जमा करेगा और फिर बताए गए सभी को वापस कर देगा। मैं यहाँ भंडारण के लिए memcached का उपयोग करना होगा, यह अपने स्वयं के क्रॉस-प्रोसेस स्टोरेज बनाने से आसान है।