在班级中记录- Python

2024-04-20 07:23:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用Python的logging模块,并对使用它的最佳方式有疑问。

我定义了几个类,想要编写日志,并且能够同时设置所有类的级别。我试过:

  • 在任何地方使用相同的记录器。但是我的类是由一个框架使用的,我没有一个可以定义主记录器的入口点。如果是,我应该如何创建它并添加处理程序?
  • 每个文件使用一个记录器。我是否应该将其创建为类属性,并仅在类第一次实例化时添加处理程序?或者将它与导入放在类定义之前?This tutorial告诉我不要,但我真的不明白为什么。

谢谢你的提示。我发现了很多关于使用日志的基本方法的文档,但是关于如何在类中使用它的文档并不多。

编辑:我不认为这是下面链接的副本。接受的答案解释了如何在主程序中加载配置,然后在所有模块中使用它。但是如果我没有主程序呢?我在哪里定义它?


Tags: 模块文件实例文档框架处理程序属性定义
1条回答
网友
1楼 · 发布于 2024-04-20 07:23:25

如果在单独的文件中创建logger对象,但名称相同。他们将共享所有的属性。事实上,他们是同一个伐木工人。logging模块还允许按层次顺序创建记录器对象。例如,名为spam.mod2的记录器是spam的子记录器,其中它具有spam的所有属性,但也可以自定义。

把它具体化。我将创建一个简单的项目,它有两个模块:mod1mod2。公共模块setup_logger用于创建单个记录器。最后,我有一个main模块,它驱动整个系统。

setup_logger模块将创建一个新的logger对象,并将其命名为spam。代码可以是简单的列表,也可以是复杂的。

# setup_logger.py
import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger('spam')

接下来,mod1由于懒惰,只需重用日志对象:

# mod1.py
from setup_logger import logger

class Class1(object):
    def do_something(self):
        logger.info('Class1: doing something')

mod2创建自己的logger对象,但仍需要导入setup_logger,以便创建spam记录器。mod2通过将其命名为spam.mod2来创建子记录器:

# mod2.py
import logging
import setup_logger

# mod2 creates its own logger, as a sub logger to 'spam'
logger = logging.getLogger('spam.mod2')

class Class2:
    def do_something(self):
        logger.info('Class2: doing something')

最后,main将把它们放在一起:

# main.py
import mod1
import mod2


if __name__ == '__main__':
    object1 = mod1.Class1()
    object1.do_something()

    object2 = mod2.Class2()
    object2.do_something()

输出:

INFO:spam:Class1: doing something
INFO:spam.mod2:Class2: doing something

相关问题 更多 >