2

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

例如

-- 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__)

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

第一种情况的另一个优点是我可以在单个实例上设置自定义日志记录选项,它将适用于所有类,而在第二种情况下,它仅在每个记录器名称扩展父/基记录器名称时才有效,例如记录.getLogger('ABC')。但是,这些类不必位于相同的包或包层次结构中,因此这可能并不总是有意义的。

最好的方法是什么?

4

1 回答 1

1

这是相当主观的,但我之前采取的方法是logging在一个commonsutils模块中配置设置,该模块可以由不同的文件导入。每个文件都会实例化自己的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")

在此示例中,好处是您拥有一个用于配置的中心位置,而不是分散在各处的日志记录。唯一的缺点是每次都实例化一个新记录器的样板。

于 2019-08-28T03:27:18.797 回答