You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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 -A your_project worker -l info
    
    或在Celery配置文件(如celery.py)中设置:
    CELERY_LOG_LEVEL = 'INFO'
    CELERY_WORKER_LOG_FORMAT = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
    

内容的提问来源于stack exchange,提问作者whatserface

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 09:55:15