這裏是我的解決方案,來到我們的討論中。感謝大家的建議。
用法:
>>> import logging
>>> logging.basicConfig(level=logging.DEBUG)
>>> from hierlogger import hierlogger as logger
>>> def main():
... logger().debug("test")
...
>>> main()
DEBUG:main:test
默認情況下,將其命名爲記錄儀的...你也可以通過提供參數控制的深度:
3 - module.class.method默認
2 - module.class
1 - 僅模塊
記錄器實例也被緩存以防止在每次調用時計算記錄器名稱。 我希望有人會喜歡它。
代碼:
import logging
import inspect
class NullHandler(logging.Handler):
def emit(self, record): pass
def hierlogger(level=3):
callerFrame = inspect.stack()[1]
caller = callerFrame[0]
lname = '__heirlogger'+str(level)+'__'
if lname not in caller.f_locals:
loggerName = str()
if level >= 1:
try:
loggerName += inspect.getmodule(inspect.stack()[1][0]).__name__
except: pass
if 'self' in caller.f_locals and (level >= 2):
loggerName += ('.' if len(loggerName) > 0 else '') +
caller.f_locals['self'].__class__.__name__
if callerFrame[3] != '' and level >= 3:
loggerName += ('.' if len(loggerName) > 0 else '') + callerFrame[3]
caller.f_locals[lname] = logging.getLogger(loggerName)
caller.f_locals[lname].addHandler(NullHandler())
return caller.f_locals[lname]
是的,我想過'__name__',但它目前的模塊的只有名稱,沒有完整的'。 。。 '字符串。你知道我怎麼能得到這樣的字符串? 順便說一句,'%(process)d'是很棒的提示,謝謝! –
2010-06-07 13:25:05
@Zaar:'__name__'是導入的全名,而不僅僅是最後一部分(假設是標準導入機制)。請嘗試一下。 – 2010-06-07 14:21:22
是的,我明白了!現在我全部定下來了。謝謝! – 2010-06-07 14:43:03