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
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文件中。