Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python跨子类共享日志记录_Python_Logging_Python Logging - Fatal编程技术网

Python跨子类共享日志记录

Python跨子类共享日志记录,python,logging,python-logging,Python,Logging,Python Logging,我试图找到一种跨类/子类/模块共享日志的最佳实践方法。以下类可以在同一个文件中,也可以分布在不同的包/模块中 例如 现在在本例中,整个类层次结构共享由基类设置的同一个记录器实例 这是个好习惯吗?或者我应该在每个.py文件的顶部设置一个全局变量,如: logger = logging.getLogger(__name__) 第一种方法看起来更面向对象,避免在模块导入上做任何事情(仅创建一个对象),而第二种方法创建一个不同的记录器,每个类都可以看到它,其名称反映了它所在的模块 第一种情况的另一个优

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

例如

现在在本例中,整个类层次结构共享由基类设置的同一个记录器实例

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

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

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


最好的方法是什么?

这是非常主观的,但我以前采用的方法是在
公用程序
UTIL
模块中配置
日志
设置,这些设置可以由不同的文件导入。每个文件都将实例化它们自己的
记录器
。我认为总是执行
logger=logging.getLogger(\uuuu name\uuuuu)
是一种很好的做法,因为它确实有助于调试

例如:

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

在本例中,好处是您有一个配置的中心位置,而不是将日志分散到任何地方。唯一的缺点是每次都要实例化一个新的记录器。

如果您想要更好的实践,我发现它非常容易使用。不确定它是否有用,但希望它会有用。
-- 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")