命名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__ ) )