如何在Django视图(Celery任务外)写入Celery日志?
Django视图中Celery日志无输出的解决方法
核心问题
celery.task日志器是Celery任务进程专属组件,仅在Celery Worker执行任务时生效。视图属于Django独立进程,调用该日志器不会被Celery日志系统处理,因此无输出。
具体解决方案
1. 改用Django进程的日志器
视图中直接使用Django自带的日志体系,推荐使用当前模块的日志器(便于日志分类管理):
def my_view(request, my_id): if is_request_valid(request): logger = logging.getLogger(__name__) logger.info('Starting a task for a thing with ID %i', my_id) my_cool_task.apply_async()
2. 关联Celery任务ID到日志(可选)
如果需要在视图日志中标记对应Celery任务的唯一ID,可在调用任务后获取ID并写入日志:
def my_view(request, my_id): if is_request_valid(request): logger = logging.getLogger(__name__) task = my_cool_task.apply_async() logger.info('Starting Celery task %s for thing with ID %i', task.id, my_id)
3. 确保Django日志配置生效
在settings.py中配置Django日志输出到控制台:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'class': 'logging.StreamHandler', }, }, 'root': { 'handlers': ['console'], 'level': 'INFO', }, # 针对视图模块单独配置(可选) 'loggers': { 'your_app.views': # 替换为你的视图所在模块路径 'handlers': ['console'], 'level': 'INFO', 'propagate': False, }, }, }
4. 区分Django与Celery的日志进程
- Django日志由Django服务进程(如
runserver、uWSGI)处理,配置写在settings.py的LOGGING中。 - Celery Worker日志由Celery进程独立处理,可通过启动参数指定:
或在Celery配置文件(如celery -A your_project worker -l infocelery.py)中设置:CELERY_LOG_LEVEL = 'INFO' CELERY_WORKER_LOG_FORMAT = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
内容的提问来源于stack exchange,提问作者whatserface
相关产品推荐
相关产品推荐

