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

如何为已停止的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:02:57