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

时间:2016-07-20 18:54:59

标签: python logging

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

示例项目布局:

/
    __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)

然后可以使用loggerfunctions_group1functions_group1functions_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)

1 个答案:

答案 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将是有价值的。

相关问题