返回顶部
首页 > 资讯 > 后端开发 > Python >Python如何将控制台输出另存为日志文件
  • 234
分享到

Python如何将控制台输出另存为日志文件

Python控制台Python日志文件Python控制台输出 2023-05-19 08:05:12 234人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

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

Python将控制台输出另存为日志文件

需求  

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

方法一:使用 Logger 类(推荐)

自定义创建 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 = './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)

./Logs/log-20210103-140231.log

5555
Traceback (most recent call last):
  File "G:\Codes\demo.py", line 33, in <module>
    print(2/0)
ZeroDivisionError: division by zero

方法二:仅使用 sys

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

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 <module>
    print(2/0)
ZeroDivisionError: division by zero

方法三:使用 logging 模块

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

必须放到 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 = './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 <module>
    print(5/0)
ZeroDivisionError: division by zero

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 &,这条命令多出了黑窗

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Python如何将控制台输出另存为日志文件

本文链接: https://lsjlt.com/news/212865.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python如何将控制台输出另存为日志文件
    目录Python将控制台输出另存为日志文件需求  方法一:使用 Logger 类(推荐)方法二:仅使用 sys方法三:使用 logging 模块Python记录日...
    99+
    2023-05-19
    Python控制台 Python日志文件 Python控制台输出
  • log4j如何控制日志输出文件名称
    小编给大家分享一下log4j如何控制日志输出文件名称,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!log4j控制日志输出文件名称1. 第一种方式在类对象中用如下方...
    99+
    2023-06-22
  • JavaScript如何将数据输出到控制台
    在 JavaScript 中打印可以是一个简单而重要的任务。这个功能不仅可以帮助我们调试错误,还可以输出数据给用户或者将生成的信息发送到日志文件中。在这篇文章中,我们将介绍几种打印技术和方法,通过它们我们可以将 JavaScript 中的数...
    99+
    2023-05-14
  • 使用Java如何监控并输出日志文件
    使用Java如何监控并输出日志文件?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。代码1:日志产生类package com.bill99.seashell.domain.svr;...
    99+
    2023-05-31
    java ava
  • docker日志如何输出到文件
    在Docker中,可以使用以下两种方式将日志输出到文件:1. 使用Docker日志驱动(Logging Driver):Docker...
    99+
    2023-09-28
    docker
  • python如何使用Colorama将颜色添加到控制台输出
    这篇文章给大家分享的是有关python如何使用Colorama将颜色添加到控制台输出的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用Colorama将颜色添加到控制台输出Colorama是一个漂亮的跨平台模块,...
    99+
    2023-06-27
  • Python 如何限制输出日志的大小
    限制输出日志的大小有多种方法,最优雅的莫过于直接使用rotate机制,这种机制广泛存在于各种编程语言,Python也不例外。其次,还可以使用mount挂载一个文件,作为日志存储的位置...
    99+
    2024-04-02
  • python如何实现控制台输出颜色
    这篇“python如何实现控制台输出颜色”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“python如何实现控制台输出颜色”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,希望大家通过这篇文章有所收获...
    99+
    2023-06-06
  • Python + logging输出到屏幕,将log日志写入到文件
    logging提供了一组便利的函数,用来做简单的日志。它们是 debug()、 info()、 warning()、 error() 和 critical()。 logging函数根据它们用来跟踪的事件的级别或严重程度来命名。标准级别及其适...
    99+
    2023-10-06
    python 软件测试 程序员 接口测试 自动化测试 测试工程师
  • log4j控制日志输出文件名称的两种方式小结
    目录log4j控制日志输出文件名称1. 第一种方式2. 第二种方式(这种方式亲测正确)如何随心所欲地自定义log4j输出格式log4j控制日志输出文件名称 1. 第一种方式 在类对象...
    99+
    2024-04-02
  • maven如何使用slf4j输出日志到文件
    目录使用slf4j输出日志到文件log4j.propertiesslf4j将部分日志打印在其他文件中logback.xml配置中新增一个FileAppender在需要额外打印日志的地...
    99+
    2024-04-02
  • nginx中如何输出php错误日志文件
    这篇文章主要介绍“nginx中如何输出php错误日志文件”,在日常操作中,相信很多人在nginx中如何输出php错误日志文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”nginx中如何输出php错误日志文件...
    99+
    2023-07-05
  • 如何使用shell将脚本输出结果记录到日志文件
    这篇文章将为大家详细讲解有关如何使用shell将脚本输出结果记录到日志文件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用tee命令:sh portal/main.sh |tee log.txt获取脚本...
    99+
    2023-06-09
  • java如何将输出内容保存到文件
    要将输出内容保存到文件,可以使用Java中的FileOutputStream和PrintWriter类。下面是一个示例代码,将输出内...
    99+
    2023-08-08
    java
  • 如何从指定的网络端口上采集日志到控制台输出和HDFS
    小编给大家分享一下如何从指定的网络端口上采集日志到控制台输出和HDFS,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!需求1:从指定的网络端口上采集日志到控制台输出和HDFS负载算法故障转移:可以指定优先级,数字越大越优先a...
    99+
    2023-06-02
  • python如何将数据输出到文件中
    要将数据输出到文件中,可以使用Python中的文件对象和相关的方法。首先,需要使用内置的`open()`函数来打开一个文件,并传入文...
    99+
    2023-09-20
    python
  • python如何将矩阵保存为文本文件
    使用python将矩阵保存为文本文件的方法:1.新建python项目;2.导入numpy模块;3.创建矩阵;4.使用np.savetxt()方法保存;具体步骤如下:首先,打开python,并新建一个python项目;python项目创建好后...
    99+
    2024-04-02
  • python如何将结果保存为文本文件
    小编给大家分享一下python如何将结果保存为文本文件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!结果保存为文本文件import requestsfr...
    99+
    2023-06-27
  • 如何让shell终端和goland控制台输出彩色的文字
    终端输出彩色文字 开发工具:Mac,Goland,Mac自带shell。这是基于Mac的测试结果,根据读者留言,在Windows上不生效,标识符不一样。 在终端输出这段命令,将的到一...
    99+
    2024-04-02
  • 如何在Ubuntu系统中用ramlog将日志文件转存至内存中
    本篇内容主要讲解“如何在Ubuntu系统中用ramlog将日志文件转存至内存中”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何在Ubuntu系统中用ramlog将日志文件转存至内存中”吧!Ra...
    99+
    2023-06-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作