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文件中。
posted on 2017-08-16 19:47 myworldworld 阅读(1091) 评论(0) 收藏 举报