Python 如何在大型应用程序中共享记录器?

Python 如何在大型应用程序中共享记录器?,python,logging,Python,Logging,我有一个由许多不同模块组成的应用程序,但所有内容仍然是单个应用程序的一部分。如何正确共享记录器,以便所有内容都写入同一个文件。我需要传一个记录器吗?我不想这样做 项目布局示例: / __init__.py main_application.py functions_group1.py functions_group2.py functions_group3.py 我希望能够在main_application.py中定义一个 logger = loggin

我有一个由许多不同模块组成的应用程序,但所有内容仍然是单个应用程序的一部分。如何正确共享记录器,以便所有内容都写入同一个文件。我需要传一个记录器吗?我不想这样做

项目布局示例:

/
    __init__.py
    main_application.py
    functions_group1.py
    functions_group2.py
    functions_group3.py
我希望能够在
main_application.py中定义一个

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
file_log = logging.FileHandler('logs/%s.log' % (file_name), 'a', encoding='UTF-8')
file_log.setLevel(file_level)
formatter = logging.Formatter('%(asctime)s - %(levelname)-8s - %(name)-12s - %(message)s')
file_log.setFormatter(formatter)
logger.addHandler(file_log)
然后能够在
功能组1
中使用
记录器
功能组1
功能组3
,这些都是在
主应用程序中这样导入的:

import functions_group1
import functions_group2
import functions_group3
每个文件只有一个功能列表(按类似功能分组)

功能组1


如何在整个应用程序中共享
记录器

我认为您缺少的一点是,默认情况下,Python记录器是分层的。在主应用程序中,只需创建一个具有固定名称的记录器(可以使用主脚本的名称)。例如:

mainapp.py:

import logging

root_logger = logging.getLogger(appname())
# do any logger setup 
其中
appname()
定义为:

def appname():
    return os.path.splitext(os.path.basename(sys.argv[0]))[0]
在任何模块中,您都可以获取根记录器或根记录器的子级

moduleX.py:

import logging
module_logger = logging.getLogger("%s.moduleX" % (appname()))

module\u logger
执行的任何日志记录都将由根日志记录器处理。通过
日志记录
模块,您可以完成更多的工作。也许从不同的角度再读一次会很有价值。

你考虑过阅读吗?你推荐@jornsharpe的哪一部分?我知道如何创建记录器。我不知道如何在不到处传递logger对象的情况下在整个应用程序中共享它;每个部分都为其
\uuuuu name\uuuuuuu
构建了一个记录器,但您可以在模块的顶层配置这些日志发生了什么(例如写入文件)。确定。如果我的每个函数组只是一个函数列表呢?这不是一个真正的模块,它有自己的init.py。我不确定你们认为有什么区别。您是否确实尝试过配置日志文件,并查看调用
getLogger
在需要记录的任何地方都会发生什么?
moduleX.py:

import logging
module_logger = logging.getLogger("%s.moduleX" % (appname()))