我有一个django项目运行与cron脚本,执行管理命令。这个命令为celery的循环任务创建in:
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)
....
如你所见,我在任务执行前和第一行有一个日志记录器。问题是-在项目代码更新后(另一个程序员添加了其他任务和芹菜版本更新),我的大多数任务开始消失。我的日志文件看起来是这样的(只执行了8-10个任务中的1个):
[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
芹菜日志文件不包含任何有用的信息。兔子也一样。它有很多这样的东西,但它与我的任务无关,不是吗?
[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
可能是什么问题?如何跟踪任务以了解它何时消失?
请帮忙=)
有可能您有后台运行的芹菜进程,它们是之前启动的未正确关闭的遗迹,可能正在消耗消息。试着运行
查看是否有这样的工作者 ps aux | grep celery
命令行。下面的命令将自动为你杀死所有这样的孤儿芹菜工人:
ps aux | grep celery | awk '{system("kill -9 " $2)}'
我在启动应用程序之前执行它
我的问题原因如下:
http://docs.python.org/2/howto/logging-cookbook.html logging-to-a-single-file-from-multiple-processes
虽然日志记录是线程安全的,并且支持从单个进程中的多个线程记录到单个文件,但不支持从多个进程记录到单个文件,因为在Python中没有标准的方法来序列化跨多个进程对单个文件的访问。如果您需要从多个进程中记录到单个文件,一种方法是将所有进程记录到SocketHandler中,并有一个单独的进程实现套接字服务器,从套接字读取并记录到文件中。(如果您愿意,您可以在一个现有进程中指定一个线程来执行此功能。)本节更详细地描述了这种方法,并包括一个工作套接字接收器,它可以作为一个起点,供您在自己的应用程序中使用。
http://docs.python.org/2/howto/logging-cookbook.html sending-and-receiving-logging-events-across-a-network