首先,我已经阅读了Real Python关于此主题的文章。
在学习了记录器具有层次结构之后,我想创建这个名为MyProjectLogger的新记录器,使其位于此层次结构中:
我希望所有的后代记录器都使用MyProjectLogger,因为目前我在项目中的所有记录器中都使用相同的处理程序和相同的配置(相当多)。虽然通过一个方法来实现这一点,但感觉不对。通过这种方式,我只需将处理程序添加到MyProjectLogger中一次,所有后代记录器就可以沿着层次结构向上使用MyProjectLogger的处理程序。
我不想为此使用默认的根记录器,因为我有一些第三方库正在记录它,而现在我希望项目中的记录器与库中的记录器分开记录。
所以,总之:
- 我想在层次结构中定义一个名为MyProjectLogger的记录器 - 我希望它是根记录器的直接后代 - 我希望它是源代码中所有记录器的父级 - 我认为我应该使用propagate=False,这样我就可以将处理程序添加到MyProjectLogger并使其处理后代记录器
我的唯一疑问是:我如何给它一个这样的名称,使其位于根记录器下方且高于其他记录器?
我知道:
在每个文件夹的每个文件中,我使用
我应该为项目中的所有记录器添加前缀+ '.'并创建具有该前缀的MyProjectLogger(例如
如果不是这样,我该怎么做?
在学习了记录器具有层次结构之后,我想创建这个名为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+'.')
)吗?如果不是这样,我该怎么做?
aaaBot/__init__.py
中使用root = logging.getLogger(__name__)
配置记录器,则在aaaBot/common/utils.py
中,logging.getLogger(__name__)
的父级将是root
。记录器名称层次结构源自包/模块名称层次结构,因此您不必显式声明父子关系。 - hoefling