目前,我的Django + Docker-Compose項目能夠使用Celery創建主要上傳函數insertIntoDatabase
,這是一個在後臺正常運行的異步任務。我使用名爲worker
的Docker容器運行Celery,並且我可以在控制檯中看到它的日誌。但是,現在不再發生通常在insertIntoDatabase
中工作的日誌記錄。Celery + Django - 如何記錄非任務模塊
上傳始於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)
最後的信息日誌應該是一個lo g文件,我在settings.py
中配置。現在insertIntoDatabase
是從一個任務而不是直接調用的,這種信息日誌不再出現在正確的日誌文件中。我項目中存在的所有其他日誌仍然正常工作。我應該怎樣做再次進行記錄工作?
更多參考,這裏是一個單獨的應用程序taskman
的celery.py
一部分命名爲:
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)
以下的信號並記錄芹菜文檔,但是這似乎沒有任何效力,要麼。
「不再有效」意思是什麼?如果代碼是從Django項目中調用的(例如在視圖中),它可以工作,但如果從任務調用,那麼它不起作用?工作人員如何配置日誌記錄? – Louis
「不再有效」,這意味着我放入'insertIntoDatabase'的日誌記錄不再發生。我曾經直接調用函數,但現在我調用調用該函數的任務。所有日誌記錄都是在'settings.py'中以Django文檔之後的方式配置的。 –
好的,那我該如何照顧芹菜應用程序?我在一個名爲'taskman'的應用程序中設置了'celery.py',在那裏我設置了它使用我當前正在工作的Django設置。除此之外,我還需要做些什麼,以便工作人員可以基本完成與原始功能相同的日誌記錄? –