django 命名Python记录器

ddrv8njm  于 2023-04-22  发布在  Go
关注(0)|答案(3)|浏览(132)

在Django中,我到处都有记录器,目前有硬编码的名称。
对于模块级日志记录(即,在视图函数的模块中),我有这样做的冲动。

log = logging.getLogger(__name__)

对于类级别的日志记录(例如,在类__init__方法中),我有这样做的冲动。

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

在处理几十个getLogger("hard.coded.name")问题之前,我正在寻找第二种意见。
这会起作用吗?还有人用同样缺乏想象力的方式命名他们的伐木工吗?
此外,我是否应该分解并为这个日志定义编写一个类装饰器?

5hcedyr0

5hcedyr01#

我通常不使用或不需要类级别的日志记录器,但我最多在几个类中保留我的模块。

import logging
LOG = logging.getLogger(__name__)

在模块的顶部和后续:

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

这就避免了到处都需要self.log,这往往会从把它放在每个类的Angular 来困扰我,并使我的5个字符接近79个字符行。
你总是可以使用一个伪类装饰器:

>>> 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
6kkfgxo0

6kkfgxo02#

对于类级别的日志记录,作为伪类装饰器的替代方案,您可以使用元类在类创建时为您创建日志记录器……

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

vbopmzt13#

这看起来是可行的,只是self没有__module__属性;它的类会。类级别的日志记录器调用应该如下所示:

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

相关问题