首先,保存控制台的信息不等于保存代码中的输出print的内容。控制台上的信息不仅仅只有代码中print的信息,区分控制台重定向和标准输出重定向。
-
仅保存代码中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('./log.log', sys.stdout) sys.stderr = Logger('./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('./log.log', sys.stdout) sys.stderr = Logger('./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,尽管控制台上有这些信息,
-
保存控制台上的所有信息。即控制台重定向。
测试代码:# 控制台重定向 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 >> ./log.log 2>&1
nohup python3 -u train.py >> ./log.log 2>&1 &
,不挂起后台运行
Windows下
python -u test_gpu.py >> ./log.log 2>&1
start /min python -u test_gpu.py >> ./log.log 2>&1 &
,这条命令多出了黑窗