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