如何使用跨多个模块的日志记录对象来完成Python日志记录?

时间:2014-12-14 23:33:20

标签: python logging module

我想在我的主程序中创建一个Python日志记录对象,并记录我的主程序和它在相同日志记录级别使用的模块。 logging documentation中给出的基本示例基本如下:

main.py:

import logging
import mylib

def main():
    logging.basicConfig(level = logging.INFO)
    logging.info('Started')
    mylib.do_something()
    logging.info('Finished')

if __name__ == '__main__':
    main()

mylib.py:

import logging

def do_something():
    logging.info('Doing something')

这很好用。但是,我不确定如何让Python日志记录对象执行类似的操作。例如,以下内容不起作用:

main.py:

import logging
import mylib

def main():
    verbose = True
    global log
    log = logging.getLogger(__name__)
    if verbose:
        log.setLevel(logging.INFO)
    else:
        log.setLevel(logging.DEBUG)
    log.info('Started')
    mylib.do_something()
    log.info('Finished')

if __name__ == '__main__':
    main()

mylib.py:

import logging

def do_something():
    log.info('Doing something')

它不起作用,因为log模块中无法识别全局mylib.py对象。我该怎么做?我的两个主要目标是

  • 使我的主程序中设置的日志记录级别传播到所使用的任何模块和
  • 能够使用 log 进行记录,而非“记录”(即log.info("alert")而不是logging.info("alert"))。

2 个答案:

答案 0 :(得分:3)

您的应用程序应配置一次记录(使用basicConfig或查看logging.config),然后在每个文件中配置:

import logging

log = logging.getLogger(__name__)

# further down:

log.info("alert")

因此,您在任何地方都使用记录器,而不是直接访问代码库中的logging模块。这允许您在日志配置中配置所有记录器(如前所述,它配置一次并在应用程序开始时加载)。

答案 1 :(得分:1)

您可以在每个模块中使用不同的记录器,如下所示:

import logging
LOG = logging.getLogger(__name__)

# Stuff
LOG.info("A log message")