如何在导入的Python模块中设置全局日志对象?



我想在一个由许多小脚本导入的Python模块中创建一个全局日志对象。Python模块旨在为所有脚本提供一致的设置,如日志记录、徽标、计时等。我试图在这个模块中设置日志记录,以便于一次更改所有这些脚本的日志记录特征。

Python模块的相关部分如下:

if engageLog:
    global log
    log = logging.getLogger(__name__)
    logging.root.addHandler(technicolor.ColorisingStreamHandler())

我怎么能写这样的日志对象在脚本中可用,而不需要任何设置导入模块?

在下面的示例脚本中,模块名为propyte:

#!/usr/bin/env python
"""
################################################################################
#                                                                              #
# script-1                                                                     #
#                                                                              #
################################################################################
Usage:
    script-1 [options]
Options:
    -h, --help               display help message
    --version                display version and exit
    -v, --verbose            verbose logging
    -u, --username=USERNAME  username
    --data=FILENAME          input data file [default: data.txt]
"""
name    = "script-1"
version = "2015-10-21T1331Z"
import os
import sys
import time
import docopt
import propyte
def main(options):
    global program
    program = propyte.Program(options = options)
    # access options and arguments
    input_data_filename = options["--data"]
    log.info("")
    log.info("input data file: {filename}".format(
        filename = input_data_filename
    ))
    print("")
    program.terminate()
if __name__ == "__main__":
    options = docopt.docopt(__doc__)
    if options["--version"]:
        print(version)
        exit()
    main(options)

只需在模块上使用log属性:

import propyte
propyte.log  # the global log object in the propyte module

请注意,logging模块配置已经是全局的。您可以使用logging.getLogger('somename'),它将返回与该名称关联的单例记录器对象。当您在另一个模块中检索相同的记录器时,应用于该对象的配置仍然存在。

最新更新