3

トリガーされたエラーまたはそれ以上の場合に電子メールを送信するように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 

最後に、2 つのメールを送信する必要があると思われる基本的なテスト ケースです。1 つはエラー用、もう 1 つは例外用です。

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)
4

1 に答える 1