代码之家  ›  专栏  ›  技术社区  ›  MeanStreet

登录类-Python[重复]

  •  9
  • MeanStreet  · 技术社区  · 8 年前

    我正在尝试使用Python的 logging 模块,并对使用该模块的最佳方式提出问题。

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

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

    谢谢你的提示。我找到了很多关于使用记录器的基本方法的文档,但关于如何在类中使用记录器的文档不多。

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

    1 回复  |  直到 8 年前
        1
  •  33
  •   Hai Vu    8 年前

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

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

    这个 安装程序/记录器 模块将创建一个新的记录器对象并将其命名 垃圾邮件 .代码可以简单如清单所示,也可以复杂如您所愿。

    # 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对象,但仍需要导入 安装程序/记录器 因此 垃圾邮件 已创建记录器。 mod2型 通过命名创建子记录器 垃圾邮件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.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