【发布时间】:2019-07-13 18:14:00
【问题描述】:
首先,我读过real python article on the subject。
了解到记录器有一个层次结构,我想在这样的层次结构中创建一个名为 MyProjectLogger 的新记录器:
Root logger
· MyProjectLogger
· File logger 1
· File logger 2
· ... and so on with all the loggers in my project...
以便 MyProjectLogger 用于所有后代记录器,因为现在我在项目中的所有记录器中使用具有相同配置的所有相同处理程序(很多)。虽然通过唯一的方法来做,但感觉不太对劲。通过这种方式,我只会将处理程序添加到 MyProjectLogger 一次,并且所有后代记录器都会使用 MyProjectLogger 的处理程序在层次结构中上升。
我不想为此使用默认的根记录器,因为我有一些第三方库正在登录它,现在我希望我的项目中的记录器与库中的记录器分开记录。
所以,总结一下:
- 我想在层次结构中定义一个记录器 MyProjectLogger
- 我希望它是根记录器的直接后代
- 我希望它成为我源代码中所有记录器的父级
- 我相信我应该使用propagate=False,这样我就可以将处理程序添加到MyProjectLogger 并让它处理后代记录器
我唯一的疑问是:我如何给它起这样一个名字,以便在根目录下并在其余部分之上?
我知道:
logging.getLogger() # Gets the root logger
logging.getLogger(__name__) # Gets a logger for the present file
logging.getLogger(__package__) # Gets a logger for the present module
假设我的项目有这个文件夹布局:
aaaBot/
main.py # Only file visible in this example.
# Please assume the rest of folders have files
common/
utils/
config/
database/
exceptions/
model/
wizards/
在每个文件夹的每个文件中,我使用logging.getLogger(__name__)。根目录中的 __package__ 返回 None 并且在主可执行文件 main.py 中 __name__ 是 '__main__'。
我应该添加前缀 + '.'为我项目中的所有记录器创建带有该前缀的 MyProjectLogger(如getLogger(prefix+'.'))?
如果没有,我该怎么办?
【问题讨论】:
-
应该
MyProjectLogger是所需的名称吗?因为logging.getLogger('aaaBot')已经是您项目层次结构中的根记录器。 -
那么,如果我做 logging.getLogger('aaaBot'),那么使用 logging.getLogger(____name____) 创建的每一个都将在 aaaBot logger 下?
-
没错。如果你例如在
aaaBot/__init__.py中配置一个记录器,使用root = logging.getLogger(__name__),然后是logging.getLogger(__name__)的父级,例如aaaBot/common/utils.py将是root。出于这个原因,记录器名称层次结构派生自包/模块名称层次结构,因此您不必显式声明父子关系。 -
文档中也提到过,请查看Logger Objects下的部分。
-
我在外面,但我在晚上在这里测试这个(大约 10 小时)。欢迎您发布此答案,一旦我检查它,我就会接受它。
标签: python python-3.x logging