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

2024-09-28 17:22:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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集中化。你知道吗


Tags: 文件pyimportinfoconfigformatmessagetime
1条回答
网友
1楼 · 发布于 2024-09-28 17:22:29

案例1:独立脚本/程序

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

  • 确保所有应用程序具有相同的日志文件名(例如,在配置.py,带有由脚本提供的参数“timestamp”
  • 指定appendfilemode for the fileHandler
  • 确保config.py不会在某个地方被调用两次,因为您将添加两次日志处理程序,这将导致每个日志消息被打印两次。你知道吗

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

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

你知道吗配置.py地址:

def set_up_logging():
    # your logging setup code

模块示例(部分)_模块.py)地址:

import logging

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

    [...]

    logger.info('sample log')

    [...]

主要示例(主.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

相关问题 更多 >