2012-06-29 23 views
1

以下函數報告當發生運行時異常時,我想從其他函數內調用的「當前」行號(和時間)。Python - 添加動態調試記錄器樣式行號和時間函數

可以理解的是,返回的行號總是與gTime()函數本身中getframeinfo的位置有關,即它是靜態的。

我只需要gTime()函數,只要我需要line.num/time數據而不需要直接將(長)gTime代碼添加到主代碼體所需的每個位置。我想某種命令序列別名是我真正想要代替我的gTime()函數內的代碼 - 但找不到解決我的問題的任何解決方案。

標準的「記錄器」模塊在我的多線程應用程序中不能可靠工作,所以我正在使用手動解決方案。

from inspect import currentframe, getframeinfo 
from datetime import datetime 

def gTime(): 
    position = "%s [%s] - " % (str(datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f").rstrip('0')),getframeinfo(currentframe()).lineno) 
    return position 

print gTime() 
+0

爲什麼你不喜歡標準的python'logging'模塊? –

+0

就像我說的那樣:「標準'記錄器'模塊在我的多線程應用程序中不能可靠工作,所以我正在使用手動解決方案。」 - 我受這個bug http://bugs.python.org/issue11444的困擾,無法讓我們的庫更新,因爲內部原因 – evillen

+0

Concurent日誌處理程序也不會幫助嗎? http://pypi.python.org/pypi/ConcurrentLogHandler/0.8.3 –

回答

0

如果您不能使用logging,我建議使用盡可能多的,你可以它的內部,或者至少向他們學習;見http://hg.python.org/cpython/file/tip/Lib/logging/__init__.py

尤其logging.currentframe可以用來獲得一個封閉的框架:

from inspect import getframeinfo 
from logging import currentframe 
from datetime import datetime 

def callingFrame(): 
    return getframeinfo(currentframe()) 

def gTime(): 
    position = "%s [%s] - " % (str(datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f").rstrip('0')), callingFrame().lineno) 
    return position 

print gTime() 
0

「標準‘記錄器’模塊將無法可靠地我的多線程應用程序中工作,所以我訴諸一個手工滾動解決方案「。

documentation disagrees

記錄模塊的目的是線程安全的,沒有任何特殊的 工作需要由客戶來完成。它通過使用 線程鎖來實現此目的;有一個鎖來序列化訪問模塊的共享數據,並且每個處理程序還創建一個鎖來將訪問 序列化到其基礎I/O。

爲什麼它不可靠地工作?

+0

我患有此bug bugs.python.org/issue11444,無法讓我們的庫因內部原因而更新,所以在此期間,我正在尋找在另一種解決方案。我還想了解更多關於「命令序列別名」的潛力。 – evillen