2011-05-31 5 views
56

मैं सोच रहा हूं कि एक और विशिष्ट लॉगिंग सिस्टम कैसे सेट अप करें। मेरे सभी कार्यसभी सेलेरी कार्यों से लॉग फ़ाइल को एक फ़ाइल में भेजें

logger = logging.getLogger(__name__) 

मॉड्यूल-व्यापी लॉगर के रूप में उपयोग करते हैं।

मैं चाहता हूं कि अजवाइन "celeryd.log" और मेरे कार्यों को "tasks.log" पर लॉग ऑन करें, लेकिन मुझे नहीं पता कि यह काम कैसे प्राप्त किया जाए। Django-celery से CELERYD_LOG_FILE का उपयोग करके मैं सभी celeryd संबंधित लॉग संदेशों को celeryd.log पर रूट कर सकता हूं लेकिन मेरे कार्यों में बनाए गए लॉग संदेशों का कोई निशान नहीं है।

उत्तर

93

नोट: यह उत्तर सेलरी 3.0 के रूप में पुराना है, जहां अब आप अपने प्रति-कार्य लॉगर सेट अप करने के लिए get_task_logger() का उपयोग करते हैं। विवरण के लिए कृपया the Logging section of the What's new in Celery 3.0 document देखें।


सेलेरी ने प्रति कार्य लॉगिंग के लिए समर्थन समर्पित किया है। देखें Task documentation on the subject:

आप कार्यकर्ता लॉग में नैदानिक ​​उत्पादन जोड़ने के लिए कार्यकर्ताओं लकड़हारा उपयोग कर सकते हैं:

@celery.task() 
def add(x, y): 
    logger = add.get_logger() 
    logger.info("Adding %s + %s" % (x, y)) 
    return x + y 

वहाँ कई प्रवेश स्तर उपलब्ध हैं, और श्रमिकों LogLevel सेटिंग का फैसला करता है या नहीं, वे लॉग फ़ाइल में लिखा जाएगा।

बेशक, आप प्रिंट आउट का उपयोग भी कर सकते हैं क्योंकि मानक आउट/-एर को लिखे गए कुछ भी लॉग फ़ाइल में भी लिखे जाएंगे।

हुड के तहत यह सब अभी भी मानक पायथन लॉगिंग मॉड्यूल है। आप अपने स्वयं के लॉगिंग सेटअप को काम करने की अनुमति देने के लिए CELERYD_HIJACK_ROOT_LOGGER option गलत पर सेट कर सकते हैं, अन्यथा सेलेरी आपके लिए हैंडलिंग कॉन्फ़िगर करेगी।

हालांकि, कार्यों के लिए, .get_logger() कॉल आपको प्रति व्यक्तिगत कार्य को एक अलग लॉग फ़ाइल सेट करने की अनुमति देता है। बस एक logfile बहस में गुजरती हैं और यह है कि अलग फाइल करने के लिए मार्ग लॉग संदेश:

@celery.task() 
def add(x, y): 
    logger = add.get_logger(logfile='tasks.log') 
    logger.info("Adding %s + %s" % (x, y)) 
    return x + y 

इतना ही नहीं बल्कि, तो आप सिर्फ अपने उच्च-स्तर पैकेज python logging module में कॉन्फ़िगर और यह है की यह एक फ़ाइल हैंडलर दे सकते हैं खुद। मैं इसे celery.signals.after_setup_task_logger सिग्नल का उपयोग करके सेट अप करूंगा; यहाँ मुझे लगता है अपने सभी मॉड्यूल (foo.tasks.email में के रूप में और foo.tasks.scaling) एक पैकेज foo.tasks कहा जाता है में रहते हैं:

from celery.signals import after_setup_task_logger 
import logging 

def foo_tasks_setup_logging(**kw): 
    logger = logging.getLogger('foo.tasks') 
    if not logger.handlers: 
     handler = logging.FileHandler('tasks.log') 
     formatter = logging.Formatter(logging.BASIC_FORMAT) # you may want to customize this. 
     handler.setFormatter(formatter) 
     logger.addHandler(handler) 
     logger.propagate = False 

after_setup_task_logger.connect(foo_tasks_setup_logging) 

अब किसी भी लकड़हारा जिसका नाम foo.tasks साथ शुरू होता है यह करने के बजाय जड़ लकड़हारा को tasks.log को भेजे गए संदेश (सब होगा जो इनमें से कोई भी संदेश नहीं देखता क्योंकि .propagate गलत है)।

+0

पर अधिक जानकारी लॉग संदेश buffered या unbuffered हैं? मैं सोच रहा हूं कि आउट ऑफ़ ऑर्डर लॉग संदेश ऑर्डर से निष्पादित कार्यों का संकेत है। –

+0

@EricWalker: 'लॉगिंग' कुछ भी बफर नहीं करता है। 'फाइलहैंडलर' नियमित 'ओपन()' कॉल का उपयोग करता है, और डिफ़ॉल्ट फ़ाइल को टेक्स्टमोड में खोलना है, इसलिए उस पर लिखने से लाइन बफरिंग (प्रत्येक नई लाइन के बाद फ्लश, जिसका अर्थ है प्रत्येक लॉग एंट्री)। –

+0

लगता है कि 'CELERYD_HIJACK_ROOT_LOGGER' में एक टाइपो है (और 'CELERY_HIJACK_ROOT_LOGGER' नहीं) – matt

4

बस एक संकेत:

from celery.utils.log import get_task_logger 
logger = get_task_logger(__name__) 

इसके अलावा, अजवाइन लॉग सभी कार्य से उत्पादन: अजवाइन का अपना प्रवेश हैंडलर है। Celery docs for Task Logging

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