命名Pythonlogging器
在Django中,我有遍布各处的logging器,目前使用硬编码的名称。
对于模块级别的日志logging(即在一个查看function模块),我有这样做的冲动。
log = logging.getLogger(__name__)  对于类级别的日志logging(即,在类__init__方法)我有这样做的冲动。 
 self.log = logging.getLogger("%s.%s" % ( self.__module__, self.__class__.__name__)) 
 在我解决了getLogger("hard.coded.name")之前,我正在寻找第二个意见。 
这会工作吗? 其他人用同样的缺乏想象力的方式命名他们的伐木工?
此外,我应该分解并为这个日志定义写一个类装饰器?
我通常不会使用或需要类级别的logging器,但是我最多只能将模块保留在几个类中。 一个简单的:
 import logging LOG = logging.getLogger(__name__) 
在模块的顶部和随后:
 LOG.info('Spam and eggs are tasty!') 
 从文件中的任何地方通常会把我带到我想要的地方。 这样就避免了在所有地方都需要self.log ,这往往会使我self.log ,使得我从5个angular色中接近79个angular色。 
你总是可以使用伪类装饰器:
 >>> 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 
对于类级日志logging,作为伪类装饰器的替代方法,您可以在创build类时使用元类来为您创buildlogging器。
 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() 
 这看起来像它会工作,除了self不会有一个__module__属性; 其class级将会。 类级别的logging器调用应该如下所示: 
 self.log = logging.getLogger( "%s.%s" % ( self.__class__.__module__, self.__class__.__name__ ) )