python记录日志,保存控制台输出

首先,保存控制台的信息不等于保存代码中的输出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('./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,尽管控制台上有这些信息,

  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 >> ./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 &,这条命令多出了黑窗
    在这里插入图片描述

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python 中,我们可以使用内置的 logging 模块来保存日志文件。这个模块提供了丰富的功能,可以按照不同的级别(如 DEBUG、INFO、WARNING、ERROR 等)记录日志信息,并可以将日志信息输出控制台或者文件中。下面是一个简单的例子,演示如何使用 logging 模块保存日志文件: ```python import logging # 创建一个 logger 对象 logger = logging.getLogger('mylogger') logger.setLevel(logging.DEBUG) # 创建一个文件处理器,用于将日志信息写入文件中 fh = logging.FileHandler('mylogfile.log') fh.setLevel(logging.DEBUG) # 创建一个控制台处理器,用于将日志信息输出控制台 ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) # 创建一个日志格式器 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') fh.setFormatter(formatter) ch.setFormatter(formatter) # 将处理器添加到 logger 对象中 logger.addHandler(fh) logger.addHandler(ch) # 记录一些日志信息 logger.debug('debug message') logger.info('info message') logger.warning('warning message') logger.error('error message') logger.critical('critical message') ``` 在上面的例子中,我们首先创建了一个 logger 对象,并设置了日志级别为 DEBUG。然后,我们创建了一个文件处理器和一个控制台处理器,并分别设置了它们的日志级别和日志格式。最后,我们将这些处理器添加到 logger 对象中,就可以使用 logger 对象记录日志信息了。在这个例子中,我们记录了 5 条不同级别的日志信息,这些信息将保存在 "mylogfile.log" 文件中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值