如果以前有人问过这个问题,我很难找到它。我正在构建一系列相互关联的应用程序。我在一个文件中定义了基类,而子类在另一个文件中的其他地方定义。
# base.py
logger = logging.getLogger(__name__)
class Base():
def __init__(self):
logger.info("Parent success")
# class.py
logger = logging.getLogger(__name__)
class Child(Base):
def __init__(self):
super().__init__()
logger.info("Child success")
# main.py
this = Child()
但是,我希望所有的日志都显示调用类的模块,所以我希望child和parent消息都显示它实际上是由main.py调用的。这是因为有许多模块同时运行,这些模块实现了子类和基类,并对子类和基类做了一些事情。
除了将记录器作为一个init变量传递给对象之外,还有什么优雅的解决方案吗?我真的不喜欢这种设计模式,希望有一个更优雅的解决方案。
1条答案
按热度按时间1szpjjfi1#
正如其他人所指出的,最简单的方法是为记录器使用一个不同于
__name__
的名称。如果你真的希望它具有对象创建者的模块的名称,你可以在类的构造函数中使用
inspect
检测它:然而,正如其他人也指出的那样,这并不是很有用:要解决问题(日志的主要用例),您主要关心每条消息来自何处,而假模块名不必要地使该任务复杂化。
您可能实际上想要的是在日志消息中添加一些额外的上下文信息(无论出于何种原因,其中可能包括特定对象的“所有者模块”)。对此,参见例如Python日志记录:属于一个请求的组日志。