我有这样的设置:
main.py
/module
/module/__init__.py (empty)
/module.py
以下是两个文件的代码,分别为main.py
和module.py
:
main.py
import logging
from module import module
logger = logging.getLogger(__name__)
def test():
logger.warning('in main.py/test')
def main():
handler = logging.StreamHandler()
handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s %(name)s/%(module)s [%(levelname)s]: %(message)s', '%Y-%m-%d %H:%M:%S')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.warning('in main.py/main')
module.something()
if __name__ == "__main__":
main()
module.py
import logging
logger = logging.getLogger(__name__)
def something():
logger.warning('in module.py/something')
我注意到的是,这将输出以下内容(请注意模块日志记录器没有格式):
2019-10-01 09:03:40 __main__/main [WARNING]: in main.py/main
in module.py/something
当我编辑main.py
将logger = logging.getLogger( __ name __ )
更改为logger = logging.getLogger()
或者在def main():
后添加logger = logging.getLogger()
之后,日志记录会像这样(这正是我想要的):
2019-10-01 09:04:13 root/main [WARNING]: in main.py/main
2019-10-01 09:04:13 module.module/module [WARNING]: in module.py/something
为什么会这样呢?我原以为由于
main.py
导入了module.py
,它自然在层级结构上更高,所以module.py
会继承在main.py
中定义的记录器设置。需要在主模块中显式地设置根记录器(logger = logging.getLogger()
)才能使继承起作用吗?我是没有正确配置文件夹结构来让module.py
的记录器继承main.py
的记录器设置,还是文件夹结构无关紧要?我提出这个问题的原因是因为我认为应该在整个代码中使用
logger = logging.getLogger(__name__)
(甚至在main.py
中),然后根据导入结构(或文件夹结构?),决定层次结构和记录器相应地继承。而我之所以做出这种假设是因为如果我将main.py
导入到另一个程序中会怎样呢?我的意思是,我想尽可能地让记录过程变得通用化,这样我就可以将一个模块导入到另一个模块中,并且它总是继承父记录器的设置。有没有一种方法可以显示所有模块的底层层次结构,以进行调试和学习?
module.py
的文件和一个同名的目录(没有.py
),其中包含一个__init__.py
,这不是一个好主意。 可能会让你自己和任何阅读代码的人感到困惑。 可能有一条规则,说明实际导入的内容,但我认为这不是一个好主意。 - gelonida__init__.py
文件。我认为大多数人不会熟记当您执行import module
时哪个文件将被查看并编译,是module.py还是module/init.py,或者两者都需要,并且如果两者都需要,又按照什么顺序。如果您使用from module import module
导入文件,那么哪个文件将被查看。避免具有相同名称的目录可以使问题更简单。但是您说得对,您已经得到了答案,所以也许只有我感到困惑。 - gelonidamodule/__init__.py
被导入,而module.py
被忽略,因此我甚至无法重现您的问题。 - gelonida