如何改进带时间戳的错误日志记录?当前仅单条错误写入日志
日志功能改进方案
原代码的核心问题
- 用
'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
相关产品推荐
相关产品推荐

