我正在尝试使用 Python 的 logging
模块,并且对使用它的最佳方式有疑问。
我定义了几个类,想写日志并且可以同时设置所有类的级别。我试过了:
- 到处使用相同的记录器。但是我的类由框架使用,我没有可以定义主记录器的单一入口点。如果是这样,我应该如何创建它并添加处理程序?
- 每个文件使用一个记录器。我应该将它创建为类属性,并且只在类第一次实例化时添加处理程序吗?还是将它与类定义之前的导入放在一起? This tutorial告诉我不要这样做,但我真的不明白为什么。
感谢任何提示。我找到了很多关于使用记录器的基本方法的文档,但关于如何在类里面使用它的文档并不多。
编辑:我不认为它与下面的链接重复。接受的答案解释了如何在主程序中加载配置,然后在所有模块中使用它。但是,如果我没有主程序怎么办?我在哪里定义它?
如果您在单独的文件中创建记录器对象,但名称相同。他们将共享所有属性。实际上,它们是同一个记录器。 logging
模块还允许按层次顺序创建记录器对象。例如,名为 spam.mod2 的记录器是 spam 的子记录器,它具有 spam 的所有属性,但是也可以定制。
具体例子。我将创建一个包含 2 个模块的简单项目:mod1
和 mod2
。通用模块 setup_logger
用于创建单个记录器。最后,我有一个驱动整个系统的 main
模块。
setup_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
创建自己的记录器对象,但仍需要导入 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')
最后,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