我们已将django配置为向我们发送任何错误或更高版本的电子邮件。这是使用Django中的标准LOGGING configuration完成的。我想在芹菜中做同样的行为。我让它向我发送有关例外([CELERY_SEND_TASK_ERROR_EMAILS][2]
)的电子邮件,但我希望在任何定义的级别上发送电子邮件 - 巧合错误及以上。
例如,在任何django文件中,我们都可以这样做。
log = logging.getLogger(__name__)
log.error("Oh No!")
并且假设在设置中设置了以下内容,它会向我们发送电子邮件。
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'standard': {
'format': "[%(asctime)s] %(levelname)s [%(name)s.%(funcName)s:%(lineno)d] %(message)s",
'datefmt': "%d/%b/%Y %H:%M:%S"
},
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
},
},
'loggers': {
'': {
'handlers': ['logfile', 'mail_admins'],
'level': os.environ.get('DEBUG_LEVEL', 'ERROR'),
},
}
}
为清楚起见,我这样称为芹菜。
../bin/python manage.py celeryd --settings=DJANGO_SETTINGS_MODULE \
--broker=amqp://RABBITMQ_USER:RABBITMQ_PASSWORD@localhost:5672/axis \
--beat --events --pidfile=/home/var/celeryd.pid \
--logfile=/home/logs/celeryd.log \
--loglevel=WARNING > /dev/null 2>&1
必要的芹菜相关设置。
CELERY_SEND_EVENTS = True
CELERY_TRACK_STARTED = True
CELERYD_CONCURRENCY = 2
CELERYD_TASK_TIME_LIMIT = 60 * 60 * 2 # Kill anything longer than 2 hours
CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 2
CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler"
CELERY_SEND_TASK_ERROR_EMAILS = True
CELERY_MAX_PREPARING = 600
最后我觉得应该发送两封电子邮件的基本测试用例。一个用于错误,另一个用于例外..
from django.contrib.auth.models import User
import celery
from celery.schedules import crontab
from celery.utils.serialization import UnpickleableExceptionWrapper
from celery.utils.log import get_task_logger
log = get_task_logger(__name__)
@periodic_task(run_every=datetime.timedelta(minutes=5))
def noise_test(**kwargs):
log.info("Info NOISE TEST")
log.warning("Warning NOISE TEST")
log.error("Error NOISE TEST")
try:
User.objects.get(id=9999999)
except Exception as err:
from celery import current_app
err.args = list(err.args) + ["Crap"]
raise UnpickleableExceptionWrapper(
err.__class__.__module__, err.__class__.__name__, err.args)
答案 0 :(得分:2)
我正在寻找改善这种方法并获得更深层次理解的方法(@asksol),但这是我想出来的。
此代码段可放置在任何*.tasks.py
文件夹中,因为它是全局的,并且会被提取。
from celery.signals import after_setup_task_logger
def setup_logging(**kwargs):
"""
Handler names is a list of handlers from your settings.py you want to
attach to this
"""
handler_names = ['mail_admins']
import logging.config
from django.conf import settings
logging.config.dictConfig(settings.LOGGING)
logger = kwargs.get('logger')
handlers = [x for x in logging.root.handlers if x.name in handler_names]
for handler in handlers:
logger.addHandler(handler)
logger.setLevel(handler.level)
logger.propagate = False
after_setup_task_logger.connect(setup_logging)
让电子邮件流动!
情侣笔记:
mail_admins
对应settings.LOGGING.handlers
,其中包含魔法django.utils.log.AdminEmailHandler
类。DEBUG
,因为如果DEBUG = True
CELERY_SEND_TASK_ERROR_EMAILS = not DEBUG
试试这个..
@celery.task()
def dummy_test(**kwargs):
log = dummy_test.get_logger()
if settings.DEBUG:
log.setLevel(logging.DEBUG)
log.debug("Debug DUMMY TEST")
log.info("Info DUMMY TEST")
log.warning("Warning DUMMY TEST")
log.error("Error DUMMY TEST")
log.critical("Critical DUMMY TEST")
try:
User.objects.get(id=9999999)
except Exception as err:
log.exception(err)
raise
现在异常将通过一封精美的电子邮件发送。并且每条消息都被打印出来..