知识点
通过本文可以获取的知识点有:
1、celery信号中的 logging signal
after_setup_logger 参考地址
2、Django中如何配置和使用celery
3、Django中如何加载celery 信号
主要是Django中应用入口的 ready(self) 函数认识和使用
4、Python logging自定义 Handler
Python logging 模块介绍
需求分析
1、每个任务的日志独立存放,那么肯定是要能获取到任务id,然后按照任务id设定日志文件路径
2、Django程序中执行task,那么程序中日志的写入,肯定不能使用print打印输出到启动程序Django主日志中去, 那肯定是采用logging模块配置不同的logger来实现
3、Django怎么把自定义的logger和celery关联起来呢, celery有自己自带的logger(from celery.utils.log import get_task_logger),每个task 独立日志肯定不能放到这个自带的logger
需求实现
一、我们先创建Django工程和测试用的应用demoapp,然后在应用中利用celery跑一个任务task
先给出工程和应用的结构
├── demoapp│ ├── __init__.py│ ├── admin.py│ ├── apps.py│ ├── celery│ │ └── __init__.py│ ├── migrations│ │ └── __init__.py│ ├── models.py│ ├── tasks.py│ ├── tests.py│ ├── urls.py│ └── views.py├── django_celery_singal│ ├── __init__.py│ ├── __pycache__│ │ ├── __init__.cpython-36.pyc│ │ └── settings.cpython-36.pyc│ ├── asgi.py│ ├── settings.py│ ├── urls.py│ └── wsgi.py└── manage.py
注意这里有个知识点
一般情况,Django继承celery的时候,大家默认是在工程文件夹(比如这里的 django_celery_singal)下创建celery,然后在工程的__init__.py 文件中进行import加载。
其实这不是唯一选择。可以放到任何地方,关键在于启动celery的时候-A 参数后面根的值
1.1、配置celery
# demoapp/celery/__init__.pyimport osfrom celery import Celeryos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_celery_singal.settings')app = Celery(__name__)# 从Django的settings.py加载 celery的配置app.config_from_object('django.conf:settings', namespace='CELERY')# 自动发现应用中的tasks(应用中的tasks.py文件中定义的任务)app.autodiscover_tasks()# demo_celery_signal/settings.py# settings for celeryCELERY_TIMEZONE = 'Asia/Shanghai'CELERY_ENABLE_UTC = FalseCELERY_TASK_TRACK_STARTED = TrueCELERY_TASK_TIME_LIMIT = 30 * 60CELERY_BROKER_URL = "redis://127.0.0.1:6379/11"CELERY_RESULT_BACKEND = "redis://127.0.0.1:6379/11"CELERY_RESULT_SERIALIZER = 'json'
重点