我想知道在哪里配置和初始化与日志记录模块相关的内容?
例如我写了一些类,我想在执行方法时记录一些信息。我应该在模块顶部的 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
最佳做法是什么?
答案 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)
,他们应该去那里。这可确保程序包用户不会收到意外的日志文件或控制台消息。