2013-07-24 46 views
2

我有一個由許多其他類繼承的類。相關類有記錄方法和記錄文字旁邊一些額外的參數,我希望記錄:集中日誌記錄方法和日誌記錄當前行號

import logging 
# some lines to set logger 
log = logging.getLogger('some_loger') 

class SomeClass: 
    def log_it(self, log_text): 
     log.info(self.some_param + self.some_other_param + log_text + self.some_another_param) 

而且在繼承SomeClass的任何文件:

class MyOtherClass(SomeClass): 
    def some_method(self): 
     ... 
     ... 
     self.log_it('let me log this text') 

我也希望記錄當前行號(調用self.log_it的行),因此我可以輕鬆找到相關文件中的當前記錄行。

什麼是最好的pythonic方式來做到這一點?

+0

如果您不熟悉這個概念,您可能會對[AOP](https://en.wikipedia.org/wiki/Aspect-oriented_programming)感興趣,並且不直接回答您的問題。這種編程風格通常以記錄用例爲例。如果你想閱讀更多+ Python支持,請參閱這篇文章http://stackoverflow.com/questions/12356713/aspect-oriented-programming-aop-in-python。概念驗證:https://bitbucket.org/jsbueno/metapython/src/f48d6bd388fd/aspect.py – 2013-07-24 12:44:49

回答

1

您可以使用inspect包來查找調用的代碼行。

我使用這種方法來標記一個函數爲棄用,然後追蹤調用者(當然在你的單元測試中)。您可以根據您的記錄需求進行調整。

告密記錄

在該文件中,將記錄(a.py):

import logging # of course you have this 
import inspect 

# some lines to set logger 
log = logging.getLogger('some_loger') 
log.addHandler(logging.StreamHandler()) 

class SomeClass: 
    def log_it(self, log_text): 
     log.warn("DEPRECATION WARNING: {0[3]} was called from {1[3]} at line {1[2]} in {1[1]}".format(*inspect.stack()[:2])) 

在 「兒童」 文件(b.py):

from a import SomeClass 

class MyOtherClass(SomeClass): 
    def some_method(self): 
     self.log_it('let me log this text')~ 

b = MyOtherClass() 
b.some_method() 

運行b .py:

> python b.py 
DEPRECATION WARNING: log_it was called from some_method at line 5 in b.py 

檢出inspect瞭解有關堆棧內容的詳細信息。