未从Dockerized Celery获得任何输出



我已经完成了两个类似的教程(这里和这里(,试图为我的Django项目创建一个计划任务,但我似乎无法从Celery服务中获得任何输出。

我已经在requirements.txt中添加了Celery和Redis。

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

docker-compose.yaml添加了芹菜、芹菜节拍和redis服务。

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中(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(),
},
}

cache服务似乎启动良好(输出一堆日志,以"Ready to accept connections"结尾(,但queuescheduler服务似乎没有输出任何内容。当我运行docker-compose logs -f 'queue'docker-compose logs -f 'scheduler'时,我会得到以下输出。

Attaching to

我可以从python控制台导入sample_task()并将其作为Celery任务运行。

>>> 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>

那么我做错了什么?我错过了什么?


更新

我进步了一点点。我一直在PyCharm中使用docker运行配置来--build项目,没有意识到它被设置为只构建web服务;因此没有构建队列和调度程序服务。

在我修复了这个问题之后,队列和调度程序服务输出抱怨没有设置环境变量的日志。因此,在将env_file属性添加到这两个服务之后,我现在可以连接到api_queue_1api_scheduler_1,但仍然没有进一步的输出。

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

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

我使用info日志级别运行celeni,但使用debug日志级别运行日志输出,因此debug日志没有传播。

我本以为我会看到芹菜的某种输出,即使是在信息日志级别,但我想不会。我仍然不确定为什么当我在docker容器的bashshell中运行芹菜命令时,甚至在我更改日志级别之前,我就会看到输出。

相关内容

  • 没有找到相关文章

最新更新