我正在尝试找到一种最佳实践方法来在类/子类/模块之间共享日志。以下类可以在同一文件中,也可以分布在包/模块中。
例如
-- 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')。但是,这些类不必位于相同的程序包或程序包层次结构中,因此不一定总是有意义。
什么是最好的方法?
答案 0 :(得分:1)
这是相当主观的,但是我之前采取的方法是在logging
或commons
模块中配置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")
在此示例中,好处是您可以将配置放在中心位置,而不是将日志分散到各处。唯一的缺点是每次实例化新记录器的样板。