2008-12-30 79 views
45

在Django中,我有遍佈各地的記錄器,目前使用硬編碼名稱。命名Python記錄器

對於模塊級別的日誌記錄(即在視圖函數模塊中)我有這樣的衝動。

log = logging.getLogger(__name__) 

對於類級記錄(即,在一個類__init__方法)我有衝動做到這一點。

self.log = logging.getLogger("%s.%s" % (
    self.__module__, self.__class__.__name__)) 

我在尋找第二個觀點之前,我解決的getLogger("hard.coded.name")幾十發生。

這項工作?任何其他人都用相同的無法想象的方式命名他們的伐木工?

此外,我應該分解併爲此日誌定義編寫類裝飾器嗎?

+0

我很好奇:你爲什麼想要類級別的登錄? – glarrain 2013-06-21 15:14:41

回答

65

我通常不使用或找到需要類級別的記錄器,但我把我的模塊,在幾類最多。一個簡單的:

import logging 
LOG = logging.getLogger(__name__) 

在模塊和隨後的頂部:

LOG.info('Spam and eggs are tasty!') 

從文件中的任何地方通常得到我的地方,我想。這樣可以避免在所有地方都需要使用self.log,這往往會使我陷入困境,無論是從每個角度看待它,還是讓我的5個字符更接近79個適合的字符行。

你總是可以使用僞類裝飾:

>>> import logging 
>>> class Foo(object): 
...  def __init__(self): 
...    self.log.info('Meh') 
... 
>>> def logged_class(cls): 
...  cls.log = logging.getLogger('{0}.{1}'.format(__name__, cls.__name__)) 
... 
>>> logged_class(Foo) 
>>> logging.basicConfig(level=logging.DEBUG) 
>>> f = Foo() 
INFO:__main__.Foo:Meh 
2

看起來它會工作,但self不會有__module__屬性;其班級將會。類級記錄儀調用應該是這樣的:

self.log = logging.getLogger("%s.%s" % (self.__class__.__module__, self.__class__.__name__)) 
+1

你確定自己沒有__module__屬性嗎?我試了一下,似乎有一個。 – Kiv 2008-12-31 04:05:45

+0

自己有一個__module__屬性。 – 2008-12-31 11:07:29

+0

奇怪... >>>從日期時間進口日期 >>> d = date.today() >>> d .__ module__ 回溯(最近最後一次通話): 文件 「」,1號線,在 AttributeError的: 'datetime.date' 對象有沒有屬性 '__module__' >>> d .__類__.__ module__ '日期時間' >>> – 2009-01-02 13:53:38

3

對於類級別的日誌,作爲替代的僞類的裝飾,你可以使用一個元類,使記錄你在類創作時間...

import logging 

class Foo(object): 
    class __metaclass__(type): 
     def __init__(cls, name, bases, attrs): 
      type.__init__(name, bases, attrs) 
      cls.log = logging.getLogger('%s.%s' % (attrs['__module__'], name)) 
    def __init__(self): 
     self.log.info('here I am, a %s!' % type(self).__name__) 

if __name__ == '__main__': 
    logging.basicConfig(level=logging.DEBUG) 
    foo = Foo()