Python函数级日志需求:按函数+唯一ID生成独立日志文件
实现函数级独立日志的方案
我来分享一个简洁又好用的实现思路,用装饰器来统一处理函数级的日志逻辑——这样你不用在每个函数里重复写文件操作的代码,还能保证每个函数的日志都独立存储到函数名/{id}.txt中,执行完自动关闭文件,完美契合你的需求~
核心思路
利用Python的装饰器特性,给每个需要生成独立日志的函数套一层通用的日志处理逻辑:
- 自动获取当前函数的名称,用来创建对应的专属日志目录
- 确保日志目录存在(不存在则自动创建),避免报错
- 函数执行时,把日志内容写入
函数名/{id}.txt文件,用with语句自动处理文件关闭,不用手动操心 - 因为每个函数的id都是唯一的,完全不用担心日志文件被覆盖的问题
完整可运行代码示例
import os import datetime def function_logger(log_content_func): """装饰器:为函数添加独立日志功能""" def wrapper(func): def inner(id): # 获取当前函数的名称,作为日志目录名 func_name = func.__name__ # 构建日志目录的完整路径(当前工作目录下的函数名文件夹) log_dir = os.path.join(os.getcwd(), func_name) # 确保目录存在,不存在则自动创建(exist_ok=True避免重复创建报错) os.makedirs(log_dir, exist_ok=True) # 构建具体的日志文件路径:函数名/id.txt log_file_path = os.path.join(log_dir, f"{id}.txt") # 调用传入的日志内容生成函数,获取要写入的日志文本 log_content = log_content_func(func, id) # 写入日志,with语句会自动关闭文件,无需手动调用close() with open(log_file_path, 'w', encoding='utf-8') as f: f.write(log_content) # 执行原函数的业务逻辑 return func(id) return inner return wrapper # 自定义日志内容格式(可以根据需求随意修改) def default_log_content(func, id): current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') return f"[{current_time}] 函数{func.__name__}执行,处理id={id}" # 给目标函数添加日志功能 @function_logger(default_log_content) def f1(id): # 这里写f1的业务逻辑 print(f"f1完成id={id}的处理") @function_logger(default_log_content) def f2(id): # 这里写f2的业务逻辑 print(f"f2完成id={id}的处理") # 测试调用 if __name__ == "__main__": f1(1) f2(2) f1(3)
代码细节解释
- 装饰器
function_logger:它接收一个日志内容生成函数作为参数,这样你可以灵活给不同函数定义不同的日志格式,不用修改装饰器本身,扩展性拉满 - 目录自动创建:
os.makedirs(log_dir, exist_ok=True)会帮你自动创建函数对应的日志目录,就算目录已经存在也不会报错 - 文件自动关闭:
with open(...)是Python处理文件的最佳实践,代码块执行完后会自动关闭文件,避免资源泄漏 - 日志格式自定义:
default_log_content函数可以随意修改,比如添加函数执行时长、额外参数等信息,完全按需调整
可选优化建议
- 如果需要追加日志(比如同一个id多次执行,但你的需求里id是唯一的,所以这个可能用不上),可以把文件打开模式从
'w'改成'a' - 可以添加异常捕获逻辑,处理文件写入失败的情况,让代码更健壮
- 可以把日志根路径改成配置常量,方便后续统一修改存储位置
内容的提问来源于stack exchange,提问作者Ankit Vallecha




