在何处配置日志记录?

时间:2017-02-22 10:39:07

标签: python logging project

我想知道在哪里配置和初始化与日志记录模块相关的内容?

例如我写了一些类,我想在执行方法时记录一些信息。我应该在模块顶部的 init 或以上类中配置日志记录:

# LOGGING STUFF <--- Should be here ? 

class SomeClass:

    def __init__(self):
        # class stuff
        # LOGGING STUFF <--- Or should be here ? 

    def some_method(self):
        # method stuff
        # LOGGING SOME INFO    

    def some_method2(self):
        # method stuff
        # LOGGING SOME INFO

最佳做法是什么?

1 个答案:

答案 0 :(得分:2)

日志记录包有两个目的,协助作者生成日志并协助用户使用日志。您可以执行这两个角色,但单独考虑它们将有助于您编写干净,易懂的代码。

作者关注

作者应该在适当的级别实例化记录器:

  • 包记录器应该放在包=>文件中。请注意使用__init__,它将解析为__name__

    SomePackage
  • 模块顶部的模块记录器。注意import logging package_logger = logging.getLogger(__name__) 的力量!在这里,它将解析为__name__

    SomePackage.SomeModule
  • 类级记录器可以放在类import logging module_logger = logging.getLogger(__name__) 中(或使用meta-class)。请注意使用getLogger增强__init__的强大功能!记录器名称为__name__。另外,SomePackage.SomeModule.SomeClass中没有下划线表示它是供内部使用的。:

    _class_logger
  • 班级class SomeClass: def __init__(self): self._class_logger = logging.getLogger(__name__).getChild(self.__class__.__name__) 中的实例记录器。使用ID生成唯一标识符。请注意这一点......你明白了。记录器名称为__init__

    SomePackage.SomeModule.SomeClass.<large_unique_number>

这些名称可能不适合您的申请。例如,您可能需要一个实例记录器,该记录器派生自其中一个实例化的args。但是,您仍然应该在适当的级别上抓住记录器。

用户关注

配置处理程序是用户工作。通常,作者将确保默认情况下不会激活任何处理程序。 class SomeClass: def __init__(self): self._instance_logger = logging.getLogger(__name__).getChild(self.__class__.__name__).getChild(id(self)) 会将级别警告及以上的所有日志记录转储到stderr。

logging.basicConfig

请记住,您可以使用logging.getLogger()来访问作者定义的相同记录器。

import SomePackage
import logging

logging.basicConfig()

如果您通过直接调用自己的模块来调试自己的模块,那么您可能有一个from SomePackage import SomeModule import logging # module_logger debug to a file h = logging.FileHandler('debug') h.setLevel('DEBUG') SomeModule.module_logger.addHandler(h) # class_logger warning to stderr h = logging.StreamHandler() getLogger('SomePackage.SomeModule.SomeClass').addHandler(h) ,他们应该去那里。这可确保程序包用户不会收到意外的日志文件或控制台消息。