2014-03-12 163 views
8

我有一個運行cron腳本的django項目,執行管理命令。此命令爲循環任務芹菜創建於:芹菜任務消失

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 

可能是什麼問題? 如何跟蹤任務以瞭解它何時消失?

請幫助=)

+0

您是否嘗試將日誌級別設置爲DEBUG而不是INFO? – olofom

+0

>>您是否嘗試將日誌級別設置爲DEBUG而不是INFO? 沒有附加信息=( – shaihulud

+0

這很難說,你的問題是沒有什麼詳細信息,請首先嚐試 'rabbitmqctl list_queues' 或者如果你使用虛擬主機: 'rabbitmqctl list_queues -p ' ,看到這些任務真的得到存儲在RabbitMQ中。 如果沒有,請再次檢查您的配置文件。請注意,如果您使用的是django_celery,則需要將其添加到設置: 'import djcelery; djcelery.setup_loader()'。順便說一句:如果你有多個工作人員並且正在登錄到同一個文件,你可能會遇到文件鎖定問題,一些工作人員會覆蓋其他人的線路。 – seeg

回答

1

這裏之前是我的問題的原因:
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
當一個負載很小時,一切都很完美,但隨着它的增加,我面臨這個問題。

5

這有可能是你有在後臺運行的進程芹菜,先前推出了未正常關閉,這可能是消費的消息的遺物。嘗試看看,如果你有這樣的工人通過在命令行中運行

ps aux | grep celery

。以下命令將自動殺死所有的這些孤兒芹菜工人爲您提供:

ps aux | grep celery | awk '{system("kill -9 " $2)}'

我執行它推出我的應用程序