Python在类中记录与类方法/静态方法



我想在分布在多个模块上的对象和类中进行日志记录。

通常,我正在检查类的构造函数中是否存在现有(根)记录器实例并将其传递到对象中。

import logging
from logging import config
class TestClass(object):
    def __init__(self, logger=None):
         self.logger = logger or logging.getLogger(self.__class__.__name__)
    def bar(self):
         self.logger.info("Hi, Bar")

但是如何使此记录器可用于仅包含类方法/静态方法的实用程序类?

我正在寻找这样的 smth:

class TestClass(object):
    def __init__(cls, logger=None):
         cls.logger = logger or logging.getLogger(cls.__class__.__name__)
    @classmethod
    def foo(cls):
        cls.logger.info("Hi, Foo")

我知道上面的代码不起作用,但我希望它能清楚地说明我在寻找什么。

任何想法/最佳实践都值得赞赏!

def __init__(self, logger=None):
     self.__class__.logger = logger or logging.getLogger(cls.__class__.__name__)

当然,每次您创建类的新实例时,这都会将新的记录器绑定到类上,这可能不是您想要的(或者可能是......我不确定)1

我不推荐的另一种方法是使用元类来获取记录器2

import logging
class Foo(type):
    @property
    def logger(cls):
        try:
            return cls._logger
        except AttributeError:
            cls._logger = logging.getLogger(cls.__name__)
            return cls._logger
class Bar(object):
    __metaclass__ = Foo

print Bar.logger
print Bar.logger is Bar.logger  # verify we only created one logger instance.
# careful though, the following DOESN'T work:
print Bar().logger  # AttributeError :-P

1一般来说,我认为一个主要由类/静态方法组成的类是一个有点可疑的设计。 但是,如果不了解实际代码,就很难提供更好的建议......

2我主要发布这个,以便我记得如何在其他应用程序中执行此操作......我不建议在这里使用它...

最新更新