नोट: यह उत्तर सेलरी 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
गलत है)।
पर अधिक जानकारी लॉग संदेश buffered या unbuffered हैं? मैं सोच रहा हूं कि आउट ऑफ़ ऑर्डर लॉग संदेश ऑर्डर से निष्पादित कार्यों का संकेत है। –
@EricWalker: 'लॉगिंग' कुछ भी बफर नहीं करता है। 'फाइलहैंडलर' नियमित 'ओपन()' कॉल का उपयोग करता है, और डिफ़ॉल्ट फ़ाइल को टेक्स्टमोड में खोलना है, इसलिए उस पर लिखने से लाइन बफरिंग (प्रत्येक नई लाइन के बाद फ्लश, जिसका अर्थ है प्रत्येक लॉग एंट्री)। –
लगता है कि 'CELERYD_HIJACK_ROOT_LOGGER' में एक टाइपो है (और 'CELERY_HIJACK_ROOT_LOGGER' नहीं) – matt