目前,我的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配置;否则为手动配置的。该行为与函数所属的位置无关。