2016-07-07 63 views
0

我想记录日志中各种任务的回溯 - 可以这样做吗?结果有父母,甚至可以输出图形,但我无法在任务或请求中看到父任务或任务ID。我是否必须手动将父母的任务ID传递给每个子任务?芹菜 - 如何记录父任务ID?

推论:将task_id设置为与父项相同的值是否安全?

编辑:示例代码:

@app.task() 
def root_task(arg): 
    if arg: 
     subtask.delay(arg) 


@app.task() 
def subtask(arg): 
    import celery 
    print(dir(celery.current_task)) # get parent task id here? 
    print(dir(celery.current_task.request)) # no parent here either 

注意,最好我想获得一个日志过滤器内部调用任务的ID,这显然不能访​​问的功能本地人,所以没有bind=True对我也。

回答

1

手动无需通过父task_id

如果你有简单的链条是这样

@app.task() 
def task1(): 
    return('task1') 

@app.task() 
def task2(): 
    return('task2') 

c = chain(task1.si(), task2.si()) 

你可以看到父母的任务ID

In [17]: r = c() 

In [18]: r.task_id 
Out[18]: '9c17b0b6-206c-458f-96ca-be23bc20aa9b' 

In [19]: r.parent.task_id 
Out[19]: 'e1376a29-6052-427c-8c8e-b14abcb58477' 

r.parent拥有所有必需的属性。

+0

我还不够清楚,我猜。我有一个任务有条件地使用'subtask.delay(...)'开始另一个任务 - 我想从'subtask()'代码中记录调用者的'task_id'。我会编辑更清晰的问题。 – Baczek

+0

@Baczek由于它们不相互关联,所以必须传递'task_id'。不过,我认为将task_id设置为与父'task_id'相同并不是一个好主意。 – ChillarAnand