Mea*_*eet 3 python logging class
我正在尝试使用Python的logging模块,并对使用它的最佳方式有疑问。
我定义了几个类,想要编写日志并能够同时设置所有它们的级别。我试过了 :
感谢您的任何提示。我已经找到了许多关于使用记录器的基本方法的文档,但是关于如何在类中使用它的信息并不多。
编辑:我不认为这是下面的链接的重复。接受的答案说明了如何在主程序中加载配置,然后在所有模块中使用它。但是,如果我没有主程序怎么办?我在哪里定义它?
如果在单独的文件中创建记录器对象,但名称相同。他们将共享所有属性。实际上,它们是同一记录器。该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)