Celery在django環境下生成任務獨立的log日誌

Django框架中,使用celery可以實現異步任務的目的。對於web中費時的任務,可以加到celery中,防止阻塞界面,提高用戶體驗。

然而,使用celery的過程中,如果存在多種類型的任務時,所有任務的日誌記錄是個頭疼的問題,如果直接使用python的logging模塊,會出現日誌文件爲空,日誌沒有寫入指定日誌文件的情況。

celery提供了自己封裝好的logging模塊,如果設置正確,其效果還是挺好的。


# core/tasks.py
from celery import Task
from celery.utils.log import get_task_logger

def register_task_logger(module_name):
    """Instantiate a logger at the decorated class instance level."""
    def wrapper(cls):
        cls.log = get_task_logger('%s.%s' % (module_name, cls.__name__))
        return cls
    return wrapper

@register_task_log(__name__)
class AddTask(Task):

    def run(self, x, y):
        self.log.info("Calling task add(%d, %d)" % (x, y))
        return x - y

@register_task_log(__name__)
class SubTask(Task):

    def run(self, x, y):
        self.log.info("Calling task subtract(%d, %d)" % (x, y))
        return x - y

在settings.py文件中對celery日誌進行設置


# settings.py
CELERYD_HIJACK_ROOT_LOGGER = False
LOG_CONFIG = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        "verbose": {
            'format': '%(asctime)s %(levelname)s [Line: %(lineno)s] -- %(message)s',
            "datefmt": "%Y-%m-%d %H:%M:%S"
        }
    },
    'handlers': {
        'core.tasks.AddTask': {
            'level': 'DEBUG',
            'filters': None,
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': 'add_task.log',
            'formatter': 'verbose'
        },
        'core.tasks.SubTask': {
            'level': 'DEBUG',
            'filters': None,
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': 'sub_task.log',
            'formatter': 'verbose'
        },
 }, 'loggers': { 
        'core.tasks.SubTask': { 
             'handlers': ['core.tasks.SubTask'],
             'level': 'DEBUG' if DEBUG else 'INFO', 
             'propagate': True, 
        },
       'core.tasks.SubTask': { 
             'handlers': ['core.tasks.SubTask'],
             'level': 'DEBUG' if DEBUG else 'INFO', 
             'propagate': True, 
   },
 }

logging.config.dictConfig(LOG_CONFIG)


運行過程中,AddTask任務的日誌會被記錄到add_task.log文件中,而SubTask任務的日誌會被記錄到sub_task.log文件中。






















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章