You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 13:25:19