Python 日志记录 - 每次循环迭代的新日志文件

Jam*_*mac 4 python logging

我想使用日志记录模块在 Python 中的每次循环迭代中生成一个新的日志文件。我正在 for 循环中分析数据,其中循环的每次迭代都包含有关新对象的信息。我想为每个对象生成一个日志文件。

我查看了日志记录模块的文档,可以按时间间隔或在日志文件填满时更改日志文件,但我看不到如何以新名称迭代生成新日志文件。我提前知道循环中有多少对象。

我想象的伪代码是:

import logging

for target in targets:
    logfile_name = f"{target}.log"
    logging.basicConfig(format='%(asctime)s - %(levelname)s : %(message)s',
                        datefmt='%Y-%m/%dT%H:%M:%S',
                        filename=logfile_name,
                        level=logging.DEBUG)


    # analyse target infomation
    logging.info('log target info...')

Run Code Online (Sandbox Code Playgroud)

但是,日志信息始终附加到目标 1 的第一个日志文件中。

有没有办法在每个循环开始时强制一个新的日志文件?

Mit*_*nal 7

logging您需要使用记录器对象,而不是直接使用。仔细阅读此处的文档。

创建一个新的记录器对象作为循环中的第一条语句。下面是一个有效的解决方案。

import logging
import sys


def my_custom_logger(logger_name, level=logging.DEBUG):
    """
    Method to return a custom logger with the given name and level
    """
    logger = logging.getLogger(logger_name)
    logger.setLevel(level)
    format_string = ("%(asctime)s — %(name)s — %(levelname)s — %(funcName)s:"
                    "%(lineno)d — %(message)s")
    log_format = logging.Formatter(format_string)
    # Creating and adding the console handler
    console_handler = logging.StreamHandler(sys.stdout)
    console_handler.setFormatter(log_format)
    logger.addHandler(console_handler)
    # Creating and adding the file handler
    file_handler = logging.FileHandler(logger_name, mode='a')
    file_handler.setFormatter(log_format)
    logger.addHandler(file_handler)
    return logger


if __name__ == "__main__":
    for item in range(10):
        logger = my_custom_logger(f"Logger{item}")
        logger.debug(item)
Run Code Online (Sandbox Code Playgroud)

这会为每次迭代写入不同的日志文件。