跨子类的Python共享日志记录

时间:2019-08-27 23:34:50

标签: python logging python-logging

我正在尝试找到一种最佳实践方法来在类/子类/模块之间共享日志。以下类可以在同一文件中,也可以分布在包/模块中。

例如

-- A.py  
class A:
  def __init__(self):
    self.logger = logging.getLogger(someName)

-- B.py  
class B(A):
  ...

-- C.py  
class C(B):
  def foo(self):
    self.logger.info('Hello from C!')

现在,在这种情况下,整个类层次结构共享基类设置的相同记录器实例。

这是一个好习惯吗?还是应该在每个.py文件的顶部设置一个全局变量,如:

logger = logging.getLogger(__name__)

第一种方法看起来更面向对象,并且避免在模块导入上做任何事情(仅在对象创建时),而第二种方法则创建了一个由每个类看到的不同的记录器,其名称反映了该模块所在的模块。

第一种情况的另一个优点是,我可以在单个实例上设置自定义日志记录选项,因为它可以在所有类中使用,而在第二种情况下,只有在每个记录器名称都扩展了父/基本记录器名称的情况下,它才起作用,例如logging.getLogger('A.B.C')。但是,这些类不必位于相同的程序包或程序包层次结构中,因此不一定总是有意义。

什么是最好的方法?

1 个答案:

答案 0 :(得分:1)

这是相当主观的,但是我之前采取的方法是在loggingcommons模块中配置utils设置,这些设置可以由不同的文件导入。每个文件将实例化自己的logger。我认为最好始终执行logger = logging.getLogger(__name__),因为它确实有助于调试。

示例:

-- commons.py
logging.setLevel('INFO')

-- A.py
from commons import logging

logger = logging.getLogger(__name__)

class A:
    def __init__(self):
        logger.info("init")

    def foo(self):
        logger.info("foo")

在此示例中,好处是您可以将配置放在中心位置,而不是将日志分散到各处。唯一的缺点是每次实例化新记录器的样板。