python中日志如何保存

第一种方法——重定义

1. 背景知识

在Python中,print函数的输出是通过sys.stdout这个标准输出流来实现的。默认情况下,sys.stdout指向控制台(也就是终端窗口)。当您执行print("Hello, World!")时,实际上是调用了sys.stdout.write("Hello, World!\n")。

因此,如果我们能够重定向sys.stdout,让它指向我们自定义的对象,就可以控制print函数的输出行为。

2. 实现思路

目标:让print函数的输出同时写入日志文件和显示在控制台上。

方法:创建一个自定义的类(例如Logger),重写write和flush方法。然后,将sys.stdout替换为该类的实例。

import logging
import sys

class Logger(object):
    def __init__(self, filename="training.log", stream=sys.stdout):
        self.terminal = stream  # 保存原始的标准输出流,默认是控制台sys.stdout
        self.log = open(filename, 'w', encoding='utf-8')  # 打开日志文件,追加模式

    def write(self, message):
        self.terminal.write(message)  # 输出到控制台
        self.log.write(message)       # 写入日志文件

    def flush(self):
        self.terminal.flush()  # 刷新控制台
        self.log.flush()       # 刷新日志文件
    #
    def close(self):    # 关闭日志文件
        self.log.close()

# 重定向sys.stdout
sys.stdout = Logger("training.log", sys.stdout)

# 示例:在代码中使用print
print("开始训练模型...")
for epoch in range(5):
    print(f"Epoch {epoch+1}/5")
    # 模拟训练过程
    train_loss = 0.01 * (5 - epoch)
    print(f"训练损失:{train_loss:.4f}")
print("训练完成。")

print('nihao')

这样不仅会在我们的终端控制台中显示,还可以保存到我们的日志文件training.log中

第二种方法——重定向

sh /root/task/train_model.sh > /root/task/train_log

标准输出(stdout)重定向:> 符号只重定向标准输出。如果您的脚本中有错误信息输出到标准错误(stderr),这些信息不会被保存到 train_log,而是仍然显示在终端。

第三种方法——最简单

import sys

# 暂存,用于恢复
temp = sys.stdout

# 把输出重定向到文件
f = open('screenshot.log', 'w')
# 之后使用print函数,都将内容打印到 screenshot.log 文件中
sys.stdout = f

a = 1
if a < 5 :
    print(123)
else:
    print(456)

if isinstance(a,int):
    print(000)
else:
    print(1111)
f.close()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行走的小骆驼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值