django_rq
使用 Loguru 记录 Django-RQ 任务日志
要在 Django-RQ 处理的任务中使用 Loguru
记录日志,你需要做的就是按照标准的 Loguru
使用方法配置和使用日志记录器。下面是一个简单的示例,展示如何在 Django-RQ 的任务中集成 Loguru
:
安装必要的包
首先,确保你已经安装了 django-rq
, rq
, 和 loguru
:
bash
深色版本
pip install django-rq rq loguru
在任务中使用 Loguru
接下来,创建或修改你的任务文件(例如 tasks.py
),并在其中使用 Loguru
来记录日志:
python
深色版本
from loguru import logger
from rq.decorators import job
from django.conf import settings# 如果需要,可以在这里添加更多的 Loguru 配置,比如设置日志文件等
logger.add(settings.BASE_DIR + "/debug.log", format="{time} {level} {message}", level="DEBUG")@job('default', connection_name='default')
def example_task(x, y):logger.info(f"Starting task with parameters: x={x}, y={y}")# 模拟一些处理逻辑result = x + ylogger.debug(f"Task completed with result: {result}")return result
在这个例子中,我们首先导入了 Loguru
的 logger
,然后设置了日志输出到一个文件中,并设置了日志级别为 DEBUG
。之后定义了一个名为 example_task
的任务函数,在这个函数内部使用 logger
记录信息和调试日志。
配置 Django-RQ
确保你在 settings.py
中正确配置了 Django-RQ,包括 Redis 服务器的地址等信息。并且,确保你的任务被正确的队列化并提交给 RQ 处理。
运行 Worker
为了使任务得以执行,你需要启动一个 RQ worker。可以通过以下命令运行:
bash
深色版本
python manage.py rqworker default
这里的 default
是队列的名字,与我们在 @job
装饰器中指定的一致。
通过这种方式,你可以轻松地在 Django-RQ 的任务中使用 Loguru
进行日志记录,方便调试和监控后台任务的执行情况。记得根据实际需求调整日志的格式、存储位置以及日志级别等配置。
============================
在 django_rq
中实现定时任务,通常会使用 RQ Scheduler 这个扩展库。RQ Scheduler 允许你根据时间计划执行任务,比如延迟执行任务、周期性执行任务等。下面是具体步骤来设置和使用定时任务。
安装依赖
首先,确保你已经安装了 django-rq
和 rq-scheduler
。如果还没有安装,可以通过 pip 来安装它们:
bash
深色版本
pip install django-rq rq-scheduler
配置 Django 项目
-
添加到
pythonINSTALLED_APPS
: 在你的settings.py
文件中,添加'django_rq'
到INSTALLED_APPS
列表中(如果你还没添加的话)。深色版本
INSTALLED_APPS = [# 其他应用'django_rq', ]
-
配置 RQ 队列: 确保你在
pythonsettings.py
中定义了RQ_QUEUES
,并且至少有一个队列被定义。例如:深色版本
RQ_QUEUES = {'default': {'HOST': 'localhost','PORT': 6379,'DB': 0,'PASSWORD': '','DEFAULT_TIMEOUT': 360,}, }
创建定时任务
-
创建任务函数: 在你的应用目录下创建一个
pythontasks.py
文件,并定义一些任务函数。例如:深色版本
# myapp/tasks.py from datetime import datetimedef scheduled_task():print(f"定时任务执行于 {datetime.now()}")
-
调度定时任务: 使用
rq-scheduler
提供的功能来调度这些任务。可以在你的管理命令或者视图中进行调度,但更常见的是通过管理命令或单独的脚本来启动调度器。下面是一个简单的例子,展示如何在管理命令中调度一个每分钟执行一次的任务:
python深色版本
# myapp/management/commands/start_scheduler.py from django.core.management.base import BaseCommand from rq_scheduler import Scheduler from redis import Redis from myapp.tasks import scheduled_task from datetime import timedeltaclass Command(BaseCommand):help = '启动调度器'def handle(self, *args, **kwargs):scheduler = Scheduler('default', connection=Redis()) # 使用默认队列# 每隔1分钟执行一次scheduled_taskscheduler.schedule(scheduled_time=datetime.utcnow(), # 第一次执行的时间func=scheduled_task,interval=60, # 间隔时间,单位为秒repeat=None # 如果不是无限重复,则指定重复次数)print("调度器已启动")
启动 Worker 和 Scheduler
-
运行 worker: 首先需要运行一个 RQ worker 来处理任务队列。
bash深色版本
python manage.py rqworker default
-
运行 scheduler: 然后,你需要运行 RQ 调度器来触发定时任务。
bash深色版本
python manage.py rqscheduler --interval 60
这里的
--interval 60
参数表示调度器每60秒检查一次是否有待执行的任务。你可以根据需要调整这个值。
通过上述步骤,你就能够在 Django 项目中使用 django_rq
和 rq-scheduler
实现定时任务。这样可以帮助你自动化各种后台操作,如定期清理数据、发送通知等。
SCHEDULER_JOBS
是 django-rq-scheduler
中的一个配置项,它允许你在 Django 的设置文件中直接定义需要定时执行的任务。通过这种方式,你可以更方便地管理和配置定时任务,而无需在代码逻辑中硬编码任务调度的细节。
配置 SCHEDULER_JOBS
要在你的 Django 项目中使用 SCHEDULER_JOBS
,你需要确保已经安装了 django-rq
和 django-rq-scheduler
。如果还没有安装,可以通过 pip 安装:
bash
深色版本
pip install django-rq rq-scheduler django-rq-scheduler
接下来,在你的 settings.py
文件中添加和配置 django_rq
及其调度器相关的设置。
示例配置
以下是一个如何在 settings.py
中配置 SCHEDULER_JOBS
的示例:
python
深色版本
# settings.pyINSTALLED_APPS = [# 其他应用'django_rq','django_rq_scheduler', # 确保已添加到INSTALLED_APPS中
]RQ_QUEUES = {'default': {'HOST': 'localhost','PORT': 6379,'DB': 0,'PASSWORD': '','DEFAULT_TIMEOUT': 360,},
}# 配置定时任务
SCHEDULER_JOBS = [{'func': 'myapp.tasks.scheduled_task', # 任务函数路径'interval': 60, # 每隔60秒执行一次'repeat': None, # 无限重复},{'func': 'myapp.tasks.another_scheduled_task','cron_string': '0 0 * * *', # 使用cron表达式每天午夜执行'repeat': None,},
]
在这个例子中,我们定义了两个定时任务:
- 第一个任务每60秒执行一次,且无限重复。
- 第二个任务使用 cron 表达式
'0 0 * * *'
每天午夜执行一次。
注意事项
-
任务函数: 在
SCHEDULER_JOBS
中指定的任务函数应是可导入的,并且应当接受任意关键字参数(**kwargs),因为调度器可能会传递额外的参数给这些函数。 -
运行调度器: 为了使这些定时任务生效,你需要运行 RQ 调度器。这可以通过以下命令完成:
bash深色版本
python manage.py rqscheduler --interval 60
这里的
--interval 60
参数表示调度器每隔60秒检查一次是否有待执行的任务。你可以根据需要调整这个值。
通过在 settings.py
中配置 SCHEDULER_JOBS
,你可以更加灵活和方便地管理项目的定时任务,使得任务的调度和维护变得更加直观和易于操作。
✅ 为什么必须运行 rqworker
🧠 简单理解原理
在 Django + RQ 的体系中,各个组件的职责如下:
组件 | 职责 |
---|---|
Redis | 消息中间件,保存任务队列 |
RQ Scheduler (rqscheduler ) | 安排定时任务,将任务按计划放入 Redis 队列 |
RQ Worker (rqworker ) | 从 Redis 中取出任务并实际执行 |
所以:
SCHEDULER_JOBS
和rqscheduler
:只是负责“安排”任务何时进入队列。rqworker
:才是真正“执行”任务的人。
如果你不运行 rqworker
,虽然调度器会把任务加入队列,但这些任务永远不会被消费和执行!
✅ 正确使用流程(包含定时任务)
你需要同时运行以下两个服务:
1. 启动 worker(处理任务)
bash
深色版本
python manage.py rqworker default
或者有多个队列时:
bash
深色版本
python manage.py rqworker default high low
2. 启动 scheduler(安排定时任务)
bash
深色版本
python manage.py rqscheduler --interval 1
--interval 1
表示每秒钟检查一次是否有到期的任务要触发(你可以根据需求调整间隔)。
✅ 示例验证任务是否执行成功
tasks.py
python
深色版本
# myapp/tasks.py
import logginglogger = logging.getLogger(__name__)def scheduled_task():logger.info("定时任务已执行!")print("✅ 定时任务执行成功!")
settings.py
python
深色版本
SCHEDULER_JOBS = [{'func': 'myapp.tasks.scheduled_task','interval': 10, # 每隔10秒执行一次'repeat': None,}
]
运行命令
终端1:启动 worker
bash
深色版本
python manage.py rqworker default
终端2:启动调度器
bash
深色版本
python manage.py rqscheduler --interval 1
你应该会在 worker 的输出中看到每隔 10 秒打印出:
深色版本
✅ 定时任务执行成功!
✅ 总结
功能 | 是否需要运行命令 | 命令 |
---|---|---|
启动定时任务调度器 | 是 | python manage.py rqscheduler |
执行任务(包括定时任务) | 是 | python manage.py rqworker [queue_name] |
只定义 SCHEDULER_JOBS | ❌ 不够 | 必须配合 worker + scheduler 才能生效 |
这里有个很大的问题,就是包版本的问题:
pip install rq==1.16.2
pip install django-rq==2.5.1
pip install django-rq-scheduler==2023.9.0
pip install rq-scheduler==0.10.0
这个版本是可用的