2012-06-18 78 views
0

芹菜記錄器有問題。我有一個渲染幀的函數。我記錄了我產生的子進程的輸出,但似乎只有每個工人從隊列中選出的第一個作業被寫入。隊列中的所有後續任務都不會生成日誌文件。我已經嘗試使用python自己的日誌記錄以及相同的問題發生。有沒有可能丟失的配置?芹菜任務記錄器不寫

@task(queue='rndr') 
def rndr(params): 

    path  = get_logger_path(params) 
    logger = rndr.get_logger(logfile=path)  
    return render(params, logger) 

我定義,因爲我重試記錄將被不同的定義,即rndr_retry.get_logger ...

我celeryconfig看起來像下面我的任務是這樣的:

BROKER_HOST = "xxx.xxx.xxx.xxx" 
BROKER_PORT = 5672 
BROKER_USER = "xxxx" 
BROKER_PASSWORD = "xxxx" 

CELERY_RESULT_BACKEND = 'amqp' 
CELERY_DISABLE_RATE_LIMITS = True 
CELERY_ACKS_LATE = True 
CELERY_IMPORTS = ['lib.tasks.concatenate', 'lib.tasks.encode', 'lib.tasks.render', 'lib.tasks.still_image', 'lib.tasks.retry'] 
CELERY_ROUTES = {'lib.tasks.encode':{'queue': 'encode'}, 
      'lib.tasks.concatenate':{'queue': 'encode'}, 
      'lib.tasks.still_image':{'queue': 'encode'}, 
      'lib.tasks.render':{'queue':'rndr'}, 
      'lib.tasks.retry':{'queue': 'retry'} 
      } 

希望有人能關於爲什麼只有第一個任務關閉隊列寫入...

謝謝你提前。

更新:這裏要求的渲染方法的部分版本沒有所有的細節問題細節...

def render(params, logger): 

    #load params to local values 

    try: 
     #create subprocess 
     output = child_proc.communicate()[0] 

     logger.info('output') 
     logger.info(output)  
     ret = child_proc.wait()     
     if ret not in [0,1]: 
      raise Exception('subprocess failed')    

    except Exception, exc: 
     logger.info(' '.join(str(x) for x in exc.args)) 
     #mark as failed... 
     return   

    return 

我要補充一點,不僅在文件沒有得到在後續任務編寫的,它不甚至不會創建日誌文件....

+0

請注意,芹菜記錄器是一樣的事情,蟒蛇記錄器;芹菜使用引擎蓋下的'logging'模塊。 –

+0

啊,是的,我也讀過。我不確定它爲什麼會在第一個隊列中工作,然後停下來...... – deecodameeko

+0

您可能需要共享'render'的代碼,或者至少是該方法的一個很好的近似值;這裏說什麼都太少了。 –

回答

1

經過一些試驗後,我注意到傳遞的日誌文件沒有被創建。我添加了一個方法來確保文件在傳遞給get_logger()之前已經存在。仍然沒有運氣。由於我的大多數任務都運行子進程,因此我決定採用更簡單的方法,並打開一個文件對象,並將其傳遞給stdout和stderr中的子進程調用,並在適當的位置關閉文件對象。無論我運行多少任務,這似乎都可以工作。我應該注意到每個任務寫入一個獨特的文件。

Anyhoo,我想我會寫信給celery devs並將其標記爲一個bug。我曾經在開發論壇的某個地方看過芹菜記錄器需要一些愛。

乾杯。

更新:

與它得出的結論是記錄並不意味着使用這種方式芹菜的開發者來講之後。記錄的一個實例開始一個任務,但重複的任務不會記錄。我最終只是寫一個文件來繞過日誌模塊的問題。由於每個渲染任務使用一個唯一的文件,這個技巧並不會導致任何衝突。