如何为已停止的Python脚本记录控制台日志?
完善你的控制台日志记录器
看起来你已经搭建了一个不错的日志记录基础框架,我帮你补全代码并梳理下关键细节,让它更健壮易用:
完整可运行代码
import os import sys import datetime class Logger(object): def __init__(self): pathLogs = 'logs/' # 确保日志目录存在,exist_ok避免重复创建时报错 if not os.path.isdir(pathLogs): os.makedirs(pathLogs, exist_ok=True) # 生成无特殊字符的时间戳作为日志文件名 date_stamp = str(datetime.datetime.now()).split('.')[0] date_stamp = date_stamp.replace(" ", "_").replace(":", "") file_name = os.path.join(pathLogs, date_stamp + ".log") self.terminal = sys.stdout self.log = open(file_name, "a", encoding="utf-8") # 指定编码避免乱码 def write(self, message): self.terminal.write(message) self.log.write(message) self.log.flush() # 立即写入文件,避免缓存丢失 def flush(self): # 实现flush方法,兼容sys.stdout的标准接口 self.terminal.flush() self.log.flush() def __del__(self): # 实例销毁时自动关闭文件句柄,避免资源泄漏 self.log.close() # 快速使用示例 if __name__ == "__main__": sys.stdout = Logger() print("这是一条测试日志") print(f"日志生成时间: {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
关键优化与说明
- 目录创建容错:给
os.makedirs加上exist_ok=True,避免重复运行脚本时因目录已存在抛出异常。 - 编码兼容性:打开文件时指定
encoding="utf-8",防止中文等非ASCII字符写入日志时出现乱码。 - 实时写入保障:在
write方法中调用flush(),确保日志内容立即写入文件,不会因程序意外退出丢失缓存内容。 - 接口完整性:实现
flush方法,完全兼容sys.stdout的标准接口,避免某些场景下出现报错。 - 资源自动回收:添加
__del__方法,在Logger实例被销毁时自动关闭日志文件,避免文件句柄泄漏。
使用小技巧
- 一旦执行
sys.stdout = Logger(),后续所有print语句都会同时输出到控制台和日志文件。 - 如果需要恢复默认的控制台输出,只需执行
sys.stdout = sys.__stdout__即可。
内容的提问来源于stack exchange,提问作者sprogissd
相关产品推荐
相关产品推荐

