芹菜+Django——如何记录非任务模块



目前,我的Django+Docker-Compose项目能够使用芹菜使主上传函数insertIntoDatabase,一个异步任务在后台正常运行。我使用一个名为worker的Docker容器运行芹菜,我可以在控制台中看到它的日志。但是,通常在insertIntoDatabase中工作的日志记录现在不再发生。

上传开始于views.py:

from .tasks import db_ins_task
...
db_ins_task.delay(datapoints, user, description) # datapoints is a list of dictionaries, user and description are simple strings

任务在tasks.py中定义为:

@app.task()
def db_ins_task(datapoints, user, description):
    from utils.db.databaseinserter import insertIntoDatabase
    insertIntoDatabase(datapoints, user, description)

所以在databaseinserter.py中,以下日志不再工作:

logger = logging.getLogger('myapp.databaseinserter')
...
def insertIntoDatabase(datapoints, user, description):
    # do the database insertion work
    ...
    logger.info("This upload took %.3g seconds", elapsed_time) 

最后的info日志应该转到我在settings.py中配置的日志文件。既然insertIntoDatabase是从任务而不是直接调用的,这种类型的信息日志不再出现在适当的日志文件中。我的项目中存在的所有其他日志记录仍然可以正常工作。我应该怎么做才能使日志再次工作?

为进一步参考,这里是celery.py的一部分,在一个名为taskman的单独应用程序中:

from __future__ import absolute_import
import os
from django.apps import AppConfig
from celery import Celery, Task
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproj.settings')
from django.conf import settings
app = Celery('myproj')
class CeleryConfig(AppConfig):
    name = 'taskman'
    verbose_name = 'Celery Config'
    def ready(self):
        app.config_from_object('django.conf:settings')
        app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

下面是settings.py中日志设置的相关部分:

LOGGING = {
    ...
    'handlers' = {
    ...
        'dbinsfile': {
            'level':'DEBUG',
            'class':'logging.handlers.RotatingFileHandler',
            'maxBytes':LOG_LIMIT,
            'backupCount':10,
            'filename':'logs/insvals.log',
            'formatter':'values',
        },
    ...
    },
    'formatters' = {
    ...
        'values': {
            'format':'>>> [%(asctime)s.%(msecs)03d] %(levelname)s: %(message)s',
            'datefmt':"%Y/%m/%d %H:%M:%S",
        },
    ...
    },
    'loggers' = {
    ...
        'myapp.databaseinserter': {
            'handlers':['dbinsfile'],
            'level':'DEBUG',
            'propagate':False,
        },
    ...
    }
}

编辑:我认为问题是芹菜似乎劫持了根级记录器,或类似的东西。我已经尝试过CELERYD_HIJACK_ROOT_LOGGER = False,但不幸的是,它没有改变任何东西。我还尝试添加以下settings.py:

from celery.signals import setup_logging
@setup_logging.connect
def logging_prevent_celery_hijack(loglevel, logfile, format, colorize, **kwargs):
    import logging.config
    logging.config.dictConfig(LOGGING)

在信号和日志记录方面遵循了芹菜文档,但这似乎也没有效果。

摘自官方文件:

from celery.utils.log import get_task_logger
logger = get_task_logger(__name__)

如果logger.xxxx()在一个函数中被一个Celery worker调用,那么logger将被Celery配置;否则为手动配置的。该行为与函数所属的位置无关。

最新更新