我有一个正在运行的Django项目,其中包含cron脚本,执行管理命令。该命令在for循环中为Celery创建任务:
for r in pr:
log_task(tasks_logger.info, "to_queue", r)
remind.delay(r, now, send_all)
任务看起来像这样:
class RTask(Task):
abstract = True
def on_failure(self, exc, task_id, args, kwargs, einfo):
r = args[0]
log_task(logger.error, exc, r)
log_task(logger_tb.error, einfo, r)
@task(base=RTask)
def remind(r, now, send_all):
log_task(logger.info, "from_queue", r)
....
如您所见,在任务执行前和第一行内部我有一个日志记录器。问题是——在项目代码更新之后(另一位程序员添加了其他任务和celery版本更新),我的大部分任务开始消失。我的日志文件看起来像这样(只有8-10个任务中的一个被执行):
[2014-03-12 12:45:08,806] 106152122 INFO to_queue
[2014-03-12 12:45:08,819] 106138932 INFO to_queue
[2014-03-12 12:45:08,915] 106121944 INFO to_queue
[2014-03-12 12:45:08,916] 110418819 INFO from_queue
[2014-03-12 12:45:08,922] 106075777 INFO to_queue
Celery日志文件中没有任何有用的信息。RabbitMQ也是如此。
它有很多这样的东西,但与我的任务无关,或者说它与我的任务有关吗?
[2014-03-12 12:58:43,091: INFO/MainProcess] Got task from broker: celery.chord_unlock[7fe8f29f-69e1-456c-8a14-7fae0cfacc33] eta:[2014-03-12 12:58:44.089401+00:00]
[2014-03-12 12:58:43,092: INFO/MainProcess] Task celery.chord_unlock[7fe8f29f-69e1-456c-8a14-7fae0cfacc33] retry: Retry in 1s
[2014-03-12 12:58:43,092: INFO/MainProcess] Task celery.chord_unlock[7b1d4a6b-9a34-43e9-98c9-851c93ace5ce] retry: Retry in 1s
可能的问题是什么?我该如何追踪任务以了解它何时消失?
请帮忙 =)
rabbitmqctl list_queues
命令,或者如果你使用了vhost,则执行rabbitmqctl list_queues -p <vhost>
命令,查看这些任务是否真正存储在RabbitMQ中。如果不存在,请再次检查你的配置文件。请注意,如果你使用django_celery,则需要将以下内容添加到设置中:import djcelery; djcelery.setup_loader()
。另外,如果你有多个工作进程并且将日志记录到同一个文件中,则可能会出现文件锁定问题,导致某些工人覆盖其他工人的行。 - seeg