修改Python Test1代码实现按Sheet生成独立日志文件
解决Python日志写入独立文件的问题
问题分析
Test1报错原因
代码中for sheet in sheet_list:循环里的log=log(sheet)会将函数log覆盖为其返回的字符串"done!",第二次循环调用时,log已经是字符串类型,因此抛出TypeError: 'str' object is not callable错误。
Test2日志集中写入的原因
logging.basicConfig是全局配置,仅第一次调用生效,后续调用不会修改已有配置,因此所有日志都会写入第一次指定的A.log,其余文件不会生成。
修正后的代码
from datetime import datetime import logging sheet_list=['A','B','C','D'] def log(sheet): today = datetime.today() # 路径前加r避免反斜杠转义问题 file_name = r'C:\Users\ell\AppData\Local\Microsoft\WindowsApps\logs\{}.log'.format(sheet) print(file_name) # 为每个Sheet创建独立的Logger实例 logger = logging.getLogger(sheet) logger.setLevel(logging.INFO) # 避免重复添加Handler,防止日志重复写入 if not logger.handlers: # 创建文件Handler,指定写入模式为w file_handler = logging.FileHandler(file_name, mode='w') # 设置日志格式,与原basicConfig格式一致 formatter = logging.Formatter('%(levelname)s:%(name)s:%(message)s') file_handler.setFormatter(formatter) logger.addHandler(file_handler) logger.info(today) return "done!" for sheet in sheet_list: # 使用其他变量接收返回值,避免覆盖原函数 result = log(sheet)
关键修改点
- 避免函数名覆盖:将
log=log(sheet)改为result=log(sheet),保留原函数的可调用性。 - 独立Logger实例:以Sheet名称作为Logger的唯一标识,确保每个Sheet对应独立的日志配置。
- 手动配置Handler:使用
FileHandler替代logging.basicConfig,绕过全局配置的限制,实现每个日志文件独立写入。 - 防止重复Handler:检查Logger是否已有Handler,避免循环中重复添加导致同一条日志多次写入。
- 路径转义处理:路径字符串前加
r,避免Windows路径中的反斜杠被解析为转义字符。
内容的提问来源于stack exchange,提问作者Lara19
相关产品推荐
相关产品推荐

