2012-10-09 26 views
1

我對Python相當陌生。我一直在修改我們現有的Python模塊以改進日誌記錄。我遇到了一個需要標記每個方法調用(和退出)與一個特定的鍵(上下文)需要記錄和進入和退出點。該密鑰應該在根方法生成並傳遞給進一步的方法調用。帶上下文的Python日誌記錄 - 傳遞密鑰

我很困惑我應該遵循的方法。有沒有辦法在現有的方法接口中動態插入額外的參數可能會使用AOP或註釋?

或者我改寫這個問題短期 -

如何傳遞一個額外的參數傳遞給後續的方法調用?

感謝 Panks

回答

0

如果您對所有這些方法的一個記錄器實例,也許你可以有根法設定的範圍內對條目記錄並刪除它退出。

@contextlib.contextmanager 
def setup_login(logger, context): 
    old_name = logger.name 
    logger.name = context 
    yield 
    logger.name = old_name 

和根方法變爲:

def root(): 
    context = compute_context() 
    with setup_login(logger, context): 
     # call other methods 

我用logger.name,但你可以使用記錄儀的任何其他屬性,或使用任何其他單身共享全局狀態。

+0

謝謝Madjar。我有一個記錄器,但每次一個方法被不同的線程調用時,它應該創建一個新的上下文。所以我認爲我不能依靠記錄器屬性。如果我可以在運行時重載選定的方法並添加額外的參數,我可以在記錄器格式化程序中定義我的上下文關鍵字並記錄上下文關鍵字。只是一個想法。 – Panks

+0

的確,這在多線程環境中不起作用,除非使用線程本地全局變量(glocals)。添加額外參數的問題是我想不到一種簡單的方法將它添加到方法的調用中,而無需修改調用方法的代碼。另一種方式(但越來越多的黑客攻擊)將是使用'inspect'並上傳堆棧直到找到上下文關鍵字。 – madjar