Python如何将控制台输出另存为日志文件(python console怎么保存)速看

随心笔谈2年前发布 编辑
177 0
🌐 经济型:买域名、轻量云服务器、用途:游戏 网站等 《腾讯云》特点:特价机便宜 适合初学者用 点我优惠购买
🚀 拓展型:买域名、轻量云服务器、用途:游戏 网站等 《阿里云》特点:中档服务器便宜 域名备案事多 点我优惠购买
🛡️ 稳定型:买域名、轻量云服务器、用途:游戏 网站等 《西部数码》 特点:比上两家略贵但是稳定性超好事也少 点我优惠购买



目录Python将控制台输出另存为日志文件需求  方法一:使用 Logger 类(推荐)方法二:仅使用 sys方法三:使用 logging 模块Python记录日志,保存控制台输出总结

在 PyCharm 中或者说运行 python 程序时会使用 print 输出些过程信息、 traceback 异常信息 到控制台,但是程序运行结束后记录就没有了,所以想着每次运行将信息显示在控制台的同时记录到文件中。

自定义创建 Logger 类,结合 sys 进行记录控制台输出信息

demo.py

import sys
import os
import time
# 控制台输出记录到文件
class Logger(object):
? ? def __init__(self, file_name=”Default.log”, stream=sys.stdout):
? ? ? ? self.terminal=stream
? ? ? ? self.log=open(file_name, “a”)
? ? def write(self, message):
? ? ? ? self.terminal.write(message)
? ? ? ? self.log.write(message)
? ? def flush(self):
? ? ? ? pass
if __name__==’__main__’:
? ? # 自定义目录存放日志文件
? ? log_path=’https://www.jb51.net/article/Logs/’
? ? if not os.path.exists(log_path):
? ? ? ? os.makedirs(log_path)
? ? # 日志文件名按照程序运行时间设置
? ? log_file_name=log_path + ‘log-‘ + time.strftime(“%Y%m%d-%H%M%S”, time.localtime()) + ‘.log’
? ? # 记录正常的 print 信息
? ? sys.stdout=Logger(log_file_name)
? ? # 记录 traceback 异常信息
? ? sys.stderr=Logger(log_file_name)
? ? print(5555)
? ? print(2/0)

https://www.jb51.net/article/Logs/log-20210103-140231.log

5555

Traceback (most recent call last):

  File “G:\Codes\demo.py”, line 33, in

    print(2/0)

ZeroDivisionError: division by zero

将所有输出全部直接保存到文件中,不再显示到控制台

demo.py

import sys
log_print=open(‘Defalust.log’, ‘w’)
sys.stdout=log_print
sys.stderr=log_print
if __name__==’__main__’:
? ? print(555)
? ? print(2/0)

Default.log

555

Traceback (most recent call last):

  File “G:\Codes\demo.py”, line 9, in

    print(2/0)

ZeroDivisionError: division by zero

功能更加全面,主要用于输出运行日志、设置输出日志的等级、日志保存路径等等

必须放到 try……catch…… 里面才能保存 traceback 的错误的信息,然后不能保存 print (如果要保存可以参考方法二,但是这样控制台就没有 print 了)

demo.py

import logging
import os
import time
import traceback
import sys
# 创建一个 logger
logger=logging.getLogger(__name__)
# logger 的等级
logger.setLevel(level=logging.INFO)
# 创建一个 handler,写入日志文件
log_path=’https://www.jb51.net/article/Logs/’
if not os.path.exists(log_path):
? ? os.makedirs(log_path)
log_file_name=log_path + ‘log-‘ + time.strftime(“%Y%m%d-%H%M%S”, time.localtime()) + ‘.log’
logfile=log_file_name
handler=logging.FileHandler(logfile, mode=’a+’)
# 输入到日志文件中的日志等级
handler.setLevel(logging.DEBUG)
# 设置 handler 中日志记录格式
formatter=logging.Formatter(‘%(asctime)s – %(name)s – %(levelname)s – %(message)s’)
handler.setFormatter(formatter)
# 将 handler 添加到 logger 里面
logger.addHandler(handler)
# 将日志输出到控制台,默认 sys.stderr
logger.addHandler(logging.StreamHandler(sys.stdout))
logger.info(“Start print log”)
if __name__==’__main__’:
? ? try:
? ? ? ? print(5555555555)
? ? ? ? print(5/0)
? ? except Exception as e:
? ? ? ? logger.error(str(traceback.format_exc()))

log-20210103-151751.log

2021-01-03 15:17:51,597 – __main__ – INFO – Start print log

2021-01-03 15:17:51,597 – __main__ – ERROR – Traceback (most recent call last):

  File “G:\Codes\demo.py”, line 34, in

    print(5/0)

ZeroDivisionError: division by zero

首先,保存控制台的信息不等于保存代码中的输出print的内容。控制台上的信息不仅仅只有代码中print的信息,区分控制台重定向和标准输出重定向。

1.仅保存代码中print的信息。即重定向标准输出。

定义日志类:

class Logger(object):
def __init__(self, filename=’default.log’, stream=sys.stdout):
self.terminal=stream
self.log=open(filename, ‘a’)
def write(self, message):
self.terminal.write(message)
self.log.write(message)
self.terminal.flush() # 不启动缓冲,实时输出
self.log.flush()
def flush(self):
pass

在main函数开头启动日志

sys.stdout=Logger(‘https://www.jb51.net/article/log.log’, sys.stdout)
sys.stderr=Logger(‘https://www.jb51.net/article/log.log’, sys.stderr)

例子:

import tensorflow as tf
import os, sys
os.environ[‘TF_CPP_MIN_LOG_LEVEL’]=’3′
os.environ[“CUDA_DEVICE_ORDER”]=”PCI_BUS_ID”
os.environ[“CUDA_VISIBLE_DEVICES”]=”2″
class Logger(object):
def __init__(self, filename=’default.log’, stream=sys.stdout):
self.terminal=stream
self.log=open(filename, ‘a’)
def write(self, message):
self.terminal.write(message)
self.log.write(message)
self.terminal.flush() # 不启动缓冲,实时输出
self.log.flush()
def flush(self):
pass
sys.stdout=Logger(‘https://www.jb51.net/article/log.log’, sys.stdout)
sys.stderr=Logger(‘https://www.jb51.net/article/log.log’, sys.stderr)
logit=tf.constant(1)
tf_config=tf.ConfigProto(log_device_placement=True)
sess=tf.Session(config=tf_config)
print(sess.run(logit))

此时log.log中只有内容“1”,没有log_device的信息,因为其不属于stdout/stderr,尽管控制台上有这些信息,

2.保存控制台上的所有信息。即控制台重定向。

测试代码:

# 控制台重定向
import tensorflow as tf
import os, time
os.environ[‘TF_CPP_MIN_LOG_LEVEL’]=’3′
os.environ[“CUDA_DEVICE_ORDER”]=”PCI_BUS_ID”
os.environ[“CUDA_VISIBLE_DEVICES”]=”-1″
logit=tf.constant(1)
tf_config=tf.ConfigProto(log_device_placement=True)
sess=tf.Session(config=tf_config)
print(sess.run(logit))

Linux下:

python3 -u train.py >> https://www.jb51.net/article/log.log 2>&1

nohup python3 -u train.py >> https://www.jb51.net/article/log.log 2>&1 &,不挂起后台运行

Windows下:

python -u test_gpu.py >> https://www.jb51.net/article/log.log 2>&1

start /min python -u test_gpu.py >> https://www.jb51.net/article/log.log 2>&1 &,这条命令多出了黑窗

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:Python+logging输出到屏幕将log日志写入文件Python 写入训练日志文件并控制台输出解析python将控制台输出保存至文件的方法Python同时向控制台和文件输出日志logging的方法

© 版权声明

相关文章