登录课程-Python

Mea*_*eet 3 python logging class

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

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

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

感谢您的任何提示。我已经找到了许多关于使用记录器的基本方法的文档,但是关于如何在类中使用它的信息并不多。

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

Hai*_* Vu 6

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

举一个具体的例子。我将创建一个包含2个模块的简单项目:mod1和mod2。通用模块setup_logger用于创建单个记录器。最后,我有一个main驱动整个系统的模块。

该setup_logger模块将创建一个新的记录器对象并将其命名为spam。该代码可以是列出的简单代码,也可以是您想要的复杂代码。

# setup_logger.py
import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger('spam')
Run Code Online (Sandbox Code Playgroud)

接下来,mod1保持懒惰,只需重用该记录器对象:

# mod1.py
from setup_logger import logger

class Class1(object):
    def do_something(self):
        logger.info('Class1: doing something')
Run Code Online (Sandbox Code Playgroud)

mod2创建自己的日志记录器对象,但仍然需要导入setup_logger以便创建垃圾邮件记录器。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')
Run Code Online (Sandbox Code Playgroud)

最后,main将所有这些放在一起:

# main.py
import mod1
import mod2


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

    object2 = mod2.Class2()
    object2.do_something()
Run Code Online (Sandbox Code Playgroud)

输出:

INFO:spam:Class1: doing something
INFO:spam.mod2:Class2: doing something
Run Code Online (Sandbox Code Playgroud)