我们已将 django 配置为在触发任何错误或以上错误时向我们发送电子邮件。这是使用Django 中的标准 LOGGING配置完成的。我希望芹菜有同样的行为。我可以向我发送有关异常 ( [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)