Naming Python loggers
在Django,我到处都是记录员,目前都有硬编码的名字。
对于模块级日志记录(即,在视图功能模块中),我强烈要求这样做。
1 | log = logging.getLogger(__name__) |
对于类级日志记录(即,在类
1 2 | self.log = logging.getLogger("%s.%s" % ( self.__module__, self.__class__.__name__)) |
我正在寻找第二种意见,然后我处理了几十起
这行吗?还有没有人用同样不可想象的方式给他们的伐木工人命名?
此外,我应该为这个日志定义分解并编写一个类修饰符吗?
我通常不使用或不需要类级记录器,但我最多将模块保存在几个类中。简单:
1 2 | import logging LOG = logging.getLogger(__name__) |
在模块顶部和后面:
1 | LOG.info('Spam and eggs are tasty!') |
从文件中的任何地方,我通常都能到达我想去的地方。这就避免了对整个地方的
您可以始终使用伪类修饰器:
1 2 3 4 5 6 7 8 9 10 11 12 | >>> 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 |
对于类级日志记录,作为伪类修饰器的替代方法,可以使用元类在类创建时为您生成日志记录程序…
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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() |
这看起来是可行的,除了
1 | self.log = logging.getLogger("%s.%s" % ( self.__class__.__module__, self.__class__.__name__ ) ) |