关于django:命名Python记录器

Naming Python loggers

在Django,我到处都是记录员,目前都有硬编码的名字。

对于模块级日志记录(即,在视图功能模块中),我强烈要求这样做。

1
log = logging.getLogger(__name__)

对于类级日志记录(即,在类__init__方法中),我强烈要求这样做。

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

我正在寻找第二种意见,然后我处理了几十起getLogger("hard.coded.name")事件。

这行吗?还有没有人用同样不可想象的方式给他们的伐木工人命名?

此外,我应该为这个日志定义分解并编写一个类修饰符吗?


我通常不使用或不需要类级记录器,但我最多将模块保存在几个类中。简单:

1
2
import logging
LOG = logging.getLogger(__name__)

在模块顶部和后面:

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

从文件中的任何地方,我通常都能到达我想去的地方。这就避免了对整个地方的self.log的需要,从每个类的角度来看,这都会让我感到困扰,并且使我的5个字符更接近79个适合的字符行。

您可以始终使用伪类修饰器:

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()


这看起来是可行的,除了self没有__module__属性,它的类是可行的。类级记录器调用应如下所示:

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