2015-09-27 46 views
1

目前,我的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是從一個任務而不是直接調用的,這種信息日誌不再出現在正確的日誌文件中。我項目中存在的所有其他日誌仍然正常工作。我應該怎樣做再次進行記錄工作?

更多參考,這裏是一個單獨的應用程序taskmancelery.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) 

以下的信號並記錄芹菜文檔,但是這似乎沒有任何效力,要麼。

+0

「不再有效」意思是什麼?如果代碼是從Django項目中調用的(例如在視圖中),它可以工作,但如果從任務調用,那麼它不起作用?工作人員如何配置日誌記錄? – Louis

+0

「不再有效」,這意味着我放入'insertIntoDatabase'的日誌記錄不再發生。我曾經直接調用函數,但現在我調用調用該函數的任務。所有日誌記錄都是在'settings.py'中以Django文檔之後的方式配置的。 –

+0

好的,那我該如何照顧芹菜應用程序?我在一個名爲'taskman'的應用程序中設置了'celery.py',在那裏我設置了它使用我當前正在工作的Django設置。除此之外,我還需要做些什麼,以便工作人員可以基本完成與原始功能相同的日誌記錄? –

回答

0

the official document

from celery.utils.log import get_task_logger 

logger = get_task_logger(__name__) 

如果logger.xxxx()由芹菜工作者稱爲函數內部,由芹菜配置的logger將被使用;否則,它將是手動配置的那個。該行爲與該功能所屬的位置無關。

相關問題