2013-05-20 10 views
16

मैं उनके daemonization निर्देश (http://docs.celeryproject.org/en/latest/tutorials/daemonizing.html#daemonizing)एक Django अजवाइन कार्य में होने वाले अपवाद

यहाँ अपने परीक्षण कार्य

@periodic_task(run_every=timedelta(seconds=10)) 
def debugger(): 
    logger.info("Running debugger") 
    raise Exception('Failed') 

मैं एक की जरूरत है का उपयोग कर मेरे Django आवेदन के साथ काम करने के लिए अजवाइन की स्थापना की है प्रवेश कैसे करें यह जानने का तरीका कि अपवाद के कारण यह कार्य (डीबगर) विफल रहा। सेलेरी की लॉगिंग फ़ाइल logger.info ("चल रहा डीबगर") लॉग प्रिंट करती है, लेकिन यह अपवाद लॉग नहीं करती है। क्या मुझे कुछ याद आ रहा है, या क्या मुझे असफल कार्यों को किसी अन्य तरीके से ढूंढना है?

+1

अजवाइन से क्या चाहते हैं? मैं डेस्कटॉप ऐप की तरह दुर्घटनाग्रस्त नहीं हो सका। आप दो आसान तरीकों का उपयोग कर सकते हैं। 1. परिणाम बैकएंड का उपयोग करें और कार्य को गिरने के रूप में चिह्नित करें। 2. छोड़ने का प्रयास करने के लिए अजवाइन में अपने सभी कोड लपेटें। – Rustem

+3

@Rustem मैं चाहता हूं कि सेलेरी अपवादों को पकड़ ले और उन्हें स्पष्ट रूप से निगलने के बजाए लॉग फ़ाइल में लिखें ... –

उत्तर

1

ट्रेस को एक स्ट्रिंग के रूप में कैप्चर करने के लिए ट्रेसबैक मॉड्यूल का उपयोग करें और उसे लॉगर को भेजें। python logging module के लिए

from celery.utils.log import get_task_logger 

logger = get_task_logger(__name__) 

@app.task 
def div(): 
    try: 
     1/0 
    except ZeroDivisionError: 
     logger.exception("Task error") 

प्रलेखन से::

try: 
    ... 
except: 
    import traceback 
    logger.info(traceback.format_exc()) 
+3

fwif, पायथन लॉगर किसी भी स्तर पर ट्रेस को वापस शामिल कर सकता है। आपको बस इतना करना है कि कॉल में exc_info = 1 जोड़ें। जैसे logger.info ('कुछ चीज की कुछ विफल बी/सी', exc_info = 1) – user2399268

6

आप Celery User Guide देख सकते हैं

Logger.exception (संदेश, * args)

इस लॉगर पर स्तर ERROR के साथ एक संदेश लॉग करता है। तर्कों को डीबग() के रूप में व्याख्या किया जाता है। लॉगिंग संदेश में अपवाद जानकारी जोड़ दी गई है। इस विधि को केवल अपवाद हैंडलर से ही बुलाया जाना चाहिए।

+1

रुको, मैं उम्मीद करता हूं कि कार्यकर्ता लॉग में कुछ लॉग इन होने के लिए, कम से कम, प्रत्येक कार्य विफल होने के लिए ... –

3

प्रश्न:

मैं अपवाद को पकड़ने और उन्हें बजाय जाहिरा तौर पर उन्हें निगलने का एक लॉग फ़ाइल में लिखने के लिए अजवाइन चाहता हूँ ...

वर्तमान शीर्ष यहां एक पेशेवर समाधान के प्रयोजनों के लिए उत्तर दिया गया है। कई पायथन डेवलपर्स केस-दर-मामले आधार पर एक लाल झंडा पर पकड़ने वाली कंबल त्रुटि पर विचार करेंगे।

पर, मैं वहाँ उम्मीद कुछ कार्यकर्ता लॉग में लॉग इन होने के लिए चाहते हैं, कम से कम, हर काम में विफल रहता है कि के लिए

रुको ...

: यह करने के लिए एक उचित घृणा एक टिप्पणी में अच्छी तरह से व्यक्त किया गया

अजवाइन अपवाद को पकड़ने करता है, यह सिर्फ नहीं कर रहा है ओपी यह इसके साथ करना चाहता था क्या (यह परिणाम बैकएंड में यह संग्रहीत करता है)। निम्न समस्या इंटरनेट पर इस समस्या पर सबसे अच्छी पेशकश है। यह थोड़ा दिनांकित है, लेकिन कांटे और सितारों की संख्या पर ध्यान दें।

https://gist.github.com/darklow/c70a8d1147f05be877c3

सार विफलता मामले को ले और इसके साथ कुछ कस्टम कर रही है। यह ओपी की समस्या का एक सुपरसेट है। यहां अपवाद लॉग करने के लिए गिस्ट में समाधान को समायोजित करने का तरीका बताया गया है।

import logging 

logger = logging.getLogger('your.desired.logger') 


class LogErrorsTask(Task): 
    def on_failure(self, exc, task_id, args, kwargs, einfo): 
     logger.exception('Celery task failure!!!1', exc_info=exc) 
     super(LogErrorsTask, self).on_failure(exc, task_id, args, kwargs, einfo) 

तुम अब भी सुनिश्चित करें कि आपके सभी कार्य इस कार्य वर्ग से विरासत, और सार आप (base=LogErrorsTask kwarg के साथ) @task डेकोरेटर उपयोग कर रहे हैं कि कैसे यह करने के लिए पता चलता करने की आवश्यकता होगी।

इस समाधान का लाभ किसी भी अतिरिक्त प्रयास में आपके कोड को घोंसला नहीं करना है-संदर्भों को छोड़कर। यह विफलता कोड पथ पर पिगबैकिंग है कि अजवाइन पहले से ही उपयोग कर रहा है।

0

तुम भी अजवाइन एप्लिकेशन को भी पार कर, प्रत्येक @app.task डेकोरेटर को base kwarg जोड़ने से बचने के लिए:

import logging 
from celery import Celery, Task 

logger = logging.getLogger(__name__) 

class LoggingTask(Task): 
    def on_failure(self, exc, task_id, args, kwargs, einfo): 
     logger.exception('Task failed: %s' % exc, exc_info=exc) 
     super(LoggingTask, self).on_failure(exc, task_id, args, kwargs, einfo) 

class LoggingCelery(Celery): 
    def task(self, *args, **kwargs): 
     kwargs.setdefault('base', LoggingTask) 
     return super(LoggingCelery, self).task(*args, **kwargs) 

app = LoggingCelery(__name__) 
संबंधित मुद्दे