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

How to configure logging to all scripts in the prject?

我在 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 将日志记录配置到控制台和文件。

案例一:独立脚本/程序

如果我们谈论的是多个独立的脚本,那么应该以相同的方式设置日志记录:我会说,每个独立的应用程序都应该有自己的日志。如果您绝对不想这样做,则必须

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

案例二:由模块组成的大型应用

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

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__) 获取其记录器。由于模块记录器位于根记录器下方的层次结构中,因此这些日志记录 "propagated up" 到达根记录器并由根记录器的处理程序处理。

有关详细信息,请参阅 Pythons logging module doc and/or the logging cookbook