一尘不染

命名Python记录器

django

在Django中,我到处都有记录器,目前都使用硬编码名称。

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

log = logging.getLogger(__name__)

对于类级别的日志记录(即,在类__init__方法中),我很想这样做。

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

在解决数十起有关的问题之前,我正在寻找第二意见getLogger(“hard.coded.name”)。

这样行吗?还有其他人以相同的,难以想象的方式命名他们的记录器吗?

此外,是否应该分解并为该日志定义编写一个类装饰器?


阅读 261

收藏
2020-03-30

共1个答案

一尘不染

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

import logging
LOG = logging.getLogger(__name__)

在模块顶部和后续模块中:

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

从文件中的任何位置通常可以将我带到想要的位置。这样就避免了对self.log整个地方的需求,从每个类的角度来看,这往往使我感到困扰,并使我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
2020-03-30