You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python函数级日志需求:按函数+唯一ID生成独立日志文件

实现函数级独立日志的方案

我来分享一个简洁又好用的实现思路,用装饰器来统一处理函数级的日志逻辑——这样你不用在每个函数里重复写文件操作的代码,还能保证每个函数的日志都独立存储到函数名/{id}.txt中,执行完自动关闭文件,完美契合你的需求~

核心思路

利用Python的装饰器特性,给每个需要生成独立日志的函数套一层通用的日志处理逻辑:

  1. 自动获取当前函数的名称,用来创建对应的专属日志目录
  2. 确保日志目录存在(不存在则自动创建),避免报错
  3. 函数执行时,把日志内容写入函数名/{id}.txt文件,用with语句自动处理文件关闭,不用手动操心
  4. 因为每个函数的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

火山引擎 最新活动