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

Python如何复制文件或将stdout日志内容写入新文件并解决日志刷新问题

问题原因与解决方案

现有实现的核心问题

  • 日志文件反复清空:Logger类初始化时使用"w"模式打开日志文件,该模式会在文件打开时直接清空原有内容,每次启动输出捕获重新实例化Logger时都会触发清空,表现为日志内容不断刷新。
  • 日志内容读取不全:原write方法没有主动触发文件缓冲区刷新,日志内容会暂存在内存中未落地到磁盘,此时直接读取logfile.log会获取到不完整的内容。

修正后的代码实现

首先调整Logger类,解决清空和缓冲问题:

import sys

class Logger(object):
    def __init__(self, filename="Default.log", mode="a"):
        # mode参数说明:传"w"每次运行覆盖旧日志,传"a"每次运行追加内容到旧日志末尾
        self.terminal = sys.stdout
        self.log = open(filename, mode, encoding="utf-8", buffering=1)

    def write(self, message):
        self.terminal.write(message)
        self.log.write(message)

    def flush(self):
        self.terminal.flush()
        self.log.flush()

# 需每次运行生成全新日志传mode="w",需保留历史日志使用默认mode即可
sys.stdout = Logger("logfile.log", mode="w")

然后实现复制日志+关键词统计的功能:

def copy_log_and_count(keyword: str, case_sensitive: bool = True) -> int:
    count = 0
    with open("logfile.log", "r", encoding="utf-8") as origin_log, open("file.txt", "a", encoding="utf-8") as backup_log:
        for line in origin_log:
            backup_log.write(line)
            if not case_sensitive:
                line = line.lower()
                keyword = keyword.lower()
            count += line.count(keyword)
    print(f"指定关键词出现次数:{count}")
    return count

调用方式

需要统计关键词时直接调用函数即可,示例:

# 区分大小写统计"异常"出现次数
copy_log_and_count("异常")
# 不区分大小写统计"error"出现次数
copy_log_and_count("error", case_sensitive=False)

内容的提问来源于stack exchange,提问作者Asad Javed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:39:04