在将celery和django整合起来进行使用的时候,之前调试看日志都是直接在tasks.py中写print(...)
进行debug和查看具体运行日志。
经过多番查阅,最终实现了如何去自定义celery相关日志配置,可将日志输出到文件,并与django整合起来。
1. Celery 日志的默认配置
其实,Celery会把print
语句重定向到自己的给自己的日志处理,celery是有一套自己处理日志的模块的,所以调试才会在控制台看到print
的语句。
此时为了使用自己的配置,需要禁用默认配置
# disable dafault config
worker_hijack_root_logger = False
关于该参数,可见 https://docs.celeryproject.org/en/stable/userguide/configuration.html 搜索配置项名称即可见相关解释
2. Django 日志配置
在setting.py
中配置LOGGING
,增加celery
相关配置,建议如下
LOGGING_DIR = os.path.join(BASE_DIR, 'logs')
if not os.path.exists(LOGGING_DIR):
os.makedirs(LOGGING_DIR)
LOGGING = {
......
'handlers': {
......
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
},
'celery': {
'level': 'INFO',
# 此处可能需要注意celery多进程的写日志
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(LOGGING_DIR, 'celery.log'),
'maxBytes': 1024 * 1024 * 10,
'backupCount': 3,
},
},
'loggers': {
......
'celery': {
'handlers': ['console', 'celery'],
'propagate': True,
'level': 'DEBUG',
},
},
}
3. tasks.py 如何引入日志
通过以上配置,则可以简单地在task中使用自定义的配置
import logging
logger = logging.getLogger('celery')
@celery_app.task
def add_task():
logger.info("start to calculate ...")
......
4. 日志查看
最终会发现
- 在控制台看到DEBUG及以上的日志内容,且格式是自己定义的
- 在
celery.log
日志文件中可以看到INFO及以上的日志