如何配置日志中所有脚本的日志记录?

时间:2017-07-10 14:15:00

标签: python logging packages

我在config.py

中添加了以下内容
import time
import logging
#logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%Y-%m-%d %H:%M:%S', level=logging.INFO)
logFormatter = logging.Formatter('%(asctime)s %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
rootLogger = logging.getLogger()
rootLogger.setLevel(logging.INFO)

fileHandler = logging.FileHandler("{0}.log".format(time.strftime('%Y%m%d%H%M%S')))
fileHandler.setFormatter(logFormatter)
rootLogger.addHandler(fileHandler)

consoleHandler = logging.StreamHandler()
consoleHandler.setFormatter(logFormatter)
rootLogger.addHandler(consoleHandler)

然后我正在做

from config import *

在我的所有脚本和导入的文件中。

不幸的是,这会导致创建多个日志文件。

如何解决这个问题?我不会将日志配置为控制台和文件集中config.py

1 个答案:

答案 0 :(得分:1)

案例1:独立脚本/程序

如果我们讨论多个独立的脚本,应该以相同的方式设置日志:我会说,每个独立的应用程序都应该有自己的日志。如果你明确地不想要这个,你必须

  • 确保所有应用程序都具有相同的日志文件名(例如,在config.py中创建一个函数,带有参数"时间戳",这是由脚本提供的
  • 指定append filemode for the fileHandler
  • 确保config.py在某处不被调用两次,因为您将两次添加日志处理程序,这将导致每条日志消息被打印两次。

案例2:一个由模块组成的大型应用程序

如果我们讨论的是一个由模块组成的大型应用程序,您可以采用如下结构:

config.py:

def set_up_logging():
    # your logging setup code

模块示例(some_module.py):

import logging

def some_function():
    logger = logging.getLogger(__name__)

    [...]

    logger.info('sample log')

    [...]

主要示例(main.py)

import logging
from config import set_up_logging
from some_module import some_function

def main():
    set_up_logging()

    logger = logging.getLogger(__name__)
    logger.info('Executing some function')

    some_function()

    logger.info('Finished')

if __name__ == '__main__':
    main()

说明:

  • 通过调用main()中的set_up_logging()来配置应用程序根记录器
  • 从main()调用每个模块,并通过logger = logging.getLogger(__name__)获取其记录器。由于模块记录器位于根记录器下方的层次结构中,因此这些记录会向上传播"到根记录器并由根记录器的处理程序处理。

有关详细信息,请参阅Pythons logging module doc和/或logging cookbook