当根记录器配置为使用raven时,Celery周期性任务未运行

时间:2016-05-02 12:35:05

标签: django celery django-celery sentry raven

我正在使用 Django Celery 执行定期任务,并使用 Raven 作为哨兵客户端。

到目前为止,我已经成功运行了几个芹菜击败的应用程序,并且一切正常。

出于某种原因,在我正在开发的一个应用程序中,当我设置根记录器以使用'哨兵'处理程序时,定期任务没有运行。

将根记录器设置为仅使用'console'处理程序时,它确实有效。

我无法解决造成这个问题的原因。

这是我的日志记录:

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'root': {
    'level': os.environ.get('LOG_LEVEL','INFO'),
    'handlers': ['console'],
},
'filters': {
    'require_debug_false': {
        '()': 'django.utils.log.RequireDebugFalse'
    }
},
'handlers': {
    'mail_admins': {
        'level': 'ERROR',
        'filters': ['require_debug_false'],
        'class': 'django.utils.log.AdminEmailHandler'
    },
    'sentry': {
        'level': 'WARNING',
        'class': 'raven.contrib.django.raven_compat.handlers.SentryHandler',
    },
    'console': {
        'level': 'DEBUG',
        'class': 'logging.StreamHandler',
    },
},
'loggers': {
    'django.request': {
        'handlers': ['mail_admins'],
        'level': 'ERROR',
        'propagate': True,
    },
    'raven': {
        'level': 'WARNING',
        'handlers': ['console','sentry'],
        'propagate': True,
    },
    'celery': {
        'handlers': ['console'],
        'level': 'DEBUG',
    },
}

}

控制根记录器处理程序的env var:

    ENABLE_SENTRY = os.environ.get('ENABLE_SENTRY', 'FALSE') == 'TRUE'
    if (ENABLE_SENTRY):
        LOGGING['root']['handlers'] = ['console','sentry']

注意:看起来像根记录器在更改后没有登录到控制台

这就是我如何经营芹菜节拍和工人:

  

python manage.py芹菜工人-E -B --maxtasksperchild = 1000   --concurrency = 10 --loglevel = DEBUG -Ofair

这是我正在使用的软件包的一部分:

  

celery == 3.1.17 django-celery == 3.1.16 raven == 5.0.0 Django == 1.8.7

这是我的celery.py文件:

"""
This module will hold celery configuration
"""
from __future__ import absolute_import
from django.conf import settings
import os
from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE',     'ltg_backend_app.settings')

# init the celery app
app = Celery('ltg_backend_app')

# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

您是否配置了raven来捕获与Celery一起工作所需的必要信号?这是我如何配置我的Celery应用程序:

import celery
from django.conf import settings

import raven
from raven.contrib.celery import register_signal, register_logger_signal


class Celery(celery.Celery):
    def on_configure(self):
        #
        # https://docs.sentry.io/clients/python/integrations/celery/
        #
        if 'dsn' in settings.RAVEN_CONFIG and settings.RAVEN_CONFIG['dsn']:
            client = raven.Client(settings.RAVEN_CONFIG['dsn'])
        else:
            client = raven.Client()  # should do nothing

        # register a custom filter to filter out duplicate logs
        register_logger_signal(client)

        # hook into the Celery error handler
        register_signal(client)

app = Celery('foobar')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

请点击此处查看更多配置选项和详细信息:https://docs.sentry.io/clients/python/integrations/celery/