我有一个由许多不同模块组成的应用程序,但所有内容仍然是单个应用程序的一部分。如何正确共享记录器,以便所有内容都写入同一文件。我需要通过记录器吗?我宁愿不必这样做。
示例项目布局:
/
__init__.py
main_application.py
functions_group1.py
functions_group2.py
functions_group3.py
我希望能够在main_application.py
中定义logger,如此:
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)
然后可以使用logger
中functions_group1
,functions_group1
,functions_group3
main_application
import functions_group1
import functions_group2
import functions_group3
中导入的def function1_dothing():
# Want to log in here!
return ...
def function1_dothing2():
# Want to log in here!
return ...
def function1_dothing3():
# Want to log in here!
return ...
:
logger
这些文件中的每一个都只有一个功能列表(按类似功能分组)
functions_group1
con = dbConnect(MySQL(), user="readonly", password="password",
dbname="dbname", host="localhost")
如何在整个应用程序中共享Error in .local(drv, ...) :
Failed to connect to database: Error: Access denied for user
'readonly'@'localhost' (using password: YES)
?
答案 0 :(得分:2)
我认为您缺少的一点是,默认情况下,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_logger
执行的任何日志记录都将由根记录器处理。您可以使用logging
模块完成更多工作。也许以不同的视角阅读https://docs.python.org/2/howto/logging.html将是有价值的。