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
相关产品推荐
相关产品推荐

