python - 登录类(class) - Python

标签 python class logging

<分区>

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

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

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

感谢任何提示。我找到了很多关于使用记录器的基本方法的文档,但关于如何在类里面使用它的文档并不多。

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

最佳答案

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

具体例子。我将创建一个包含 2 个模块的简单项目:mod1mod2。通用模块 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

关于python - 登录类(class) - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50391429/

相关文章:

python - 如何在不启用 sigaltstack 的情况下编译 python 3?

python - 通过数组中的对象引用特定参数?

php - 将属性声明为对象?

python - 1 周内修改的文件名列表

python - Keras - 如何在 fit_generator() 中使用批处理和时期?

python - 具有各种 y 轴的子图中的纵横比

java - 将值从一个对象传递到另一个 java

java - 如何创建属于字符串中指定类的对象?

将 log4j 1.2.17 更新到 2.13.0 后出现 java.lang.ClassNotFoundException : org. apache.logging.log4j.Logger

java - 如何从日志中排除 hibernate 输出