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

如何改进带时间戳的错误日志记录?当前仅单条错误写入日志

日志功能改进方案

原代码的核心问题

  • 用'w'模式打开日志文件:每次打开都会清空原有内容,导致只保留最后一条错误
  • 装饰器返回wrapper()而非wrapper:会直接执行包装函数,导致装饰逻辑异常
  • 日志写入未加换行:多条错误会粘连在一起,无法区分
  • 多余的f.seek(0,2):追加模式下默认从文件末尾写入,此操作无意义

修正后的完整代码

def logging(func):
    from datetime import datetime

    def wrapper():
        try:
            print(f'{func.__name__} - {func.__doc__}')
            func()
        except Exception as e:
            # 格式化错误日志,末尾加换行
            log_content = f'{datetime.now().strftime("%d.%m.%Y %H:%M:%S")} - {func.__name__} - {str(e)}\n'
            print(log_content.strip())  # 打印时去掉换行
            # 用追加模式打开文件
            with open('function_errors.log', 'a', encoding='utf-8') as f:
                f.write(log_content)

    return wrapper  # 返回函数对象,而非执行结果

# 测试用例
@logging
def zerodiv():
    """It is ZeroDivisionError"""
    x = 1 / 0

@logging
def varname():
    """It is NameError"""
    x = y

@logging
def imok():
    """Here OK !"""
    x = 'Tom Cat'

zerodiv()
varname()
imok()

关键修改说明

  • 文件打开模式改为'a':追加模式会保留原有内容,新日志直接写到文件末尾
  • 装饰器返回wrapper函数对象:确保装饰器正确绑定到被装饰函数,只有当调用函数时才执行包装逻辑
  • 日志内容添加换行符\n:每条错误日志单独占一行,便于阅读和后续解析
  • 异常信息转字符串str(e):避免某些异常对象直接拼接时出现格式问题

内容的提问来源于stack exchange,提问作者3Vw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 20:33:15