没有从Dockerized Celery获得任何输出

时间:2020-09-10 13:49:35

标签: python django docker celery celerybeat

我一直在研究两个类似的教程(enter image description herehere),试图为我的Django项目创建计划任务,但是我似乎无法从Celery服务获得任何输出

我已将Celery和Redis添加到requirements.txt

Django==3.0.7
celery==4.4.7
redis==3.5.3

将celery,celery-beat和redis服务添加到docker-compose.yaml

version: "3.8"

services:
  cache:
    image: redis:alpine

  database:
    image: "postgis/postgis"
    ports:
      - "5432:5432"
    environment:
      POSTGRES_DB: postgres
      POSTGRES_USER: ${DATABASE_DEFAULT_USERNAME}
      POSTGRES_PASSWORD: ${DATABASE_DEFAULT_PASSWORD}

  web:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - .:/app
    depends_on:
      - cache
      - database
    env_file:
      - .env

  queue:
    build: .
    command: celery -A api worker -l info
    volumes:
      - .:/app
    links:
      - cache
    depends_on:
      - cache
      - database

  scheduler:
    build: .
    command: celery -A api beat -l info
    volumes:
      - .:/app
    links:
      - cache
    depends_on:
      - cache
      - database

celery.py文件添加到api/api/目录中。

import os

from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'api.settings')

app = Celery('api')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

api/api/__init__.py中添加了以下内容。

from .celery import app as celery_app

__all__ = ('celery_app',)

api/server/tasks.py中创建了一个任务。

import logging

from celery import shared_task

logger = logging.getLogger(__name__)


@shared_task
def sample_task():
    logger.debug('The sample task just ran.')

并将以下内容添加到api/api/settings/base.py中({{1}被导入到base.py中)。

api/api/settings/__init__.py

CELERY_BROKER_URL = 'redis://cache:6379' CELERY_RESULT_BACKEND = 'redis://cache:6379' CELERY_BEAT_SCHEDULE = { 'sample_task': { 'task': 'server.tasks.sample_task', 'schedule': crontab(), }, } 服务似乎可以正常启动(输出一堆日志,以“准备接受连接”结尾),但是cachequeue服务似乎没有输出任何东西。当我运行schedulerdocker-compose logs -f 'queue'时,将得到以下输出。

docker-compose logs -f 'scheduler'

我可以从python控制台导入并运行Attaching to 作为Celery任务。

sample_task()

那么我在做什么错了?我想念什么?


更新

我取得了一些进步。我一直在PyCharm中使用docker run配置来>>> from server.tasks import sample_task >>> sample_task() 2020-09-10 13:47:15,020 server.tasks DEBUG The sample task just ran. >>> sample_task.delay() <AsyncResult: 1594ed42-23d0-4302-8754-ba9097c170bd> 项目,但没有意识到它被设置为仅构建--build服务;因此没有建立队列和调度程序服务。

在我解决此问题之后,队列和调度程序服务正在输出抱怨未设置环境变量的日志。因此,在将web属性添加到两个服务之后,我现在可以附加到env_fileapi_queue_1,但是仍然没有进一步的输出。

1 个答案:

答案 0 :(得分:0)

command: celery -A api worker -l info
logger.debug('The sample task just ran.')

您看到问题了吗? ::facepalm::

我以info日志级别运行celery,但是以debug日志级别运行日志,因此debug日志没有传播。

我本来以为即使在信息日志级别,我也会看到芹菜的某种输出,但我想没有。而且我仍然不确定为什么我 在docker容器的bash shell中运行celery命令时,甚至在我更改日志级别之前就看到了输出。