我想在分布在多个模块上的对象和类中进行日志记录。
通常,我正在检查类的构造函数中是否存在现有(根)记录器实例并将其传递到对象中。
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我主要发布这个,以便我记得如何在其他应用程序中执行此操作......我不建议在这里使用它...