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

2023-11-08

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

参考文献

【1】16.6. logging — Logging facility for Python — Python 3.6.12 documentation

【2】Overview — loguru documentation

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 将控制台输出另存为日志文件 的相关文章

  • Google App Engine queue.yaml 无法在开发服务器中工作

    我无法让 dev appserver py 识别我使用queue yaml 创建的自定义队列 他们没有出现在http localhost 8000 taskqueue http localhost 8000 taskqueue 当我尝试向其
  • 使用 matplotlib 从“列表列表”绘制 3D 曲面

    我已经搜索了一些 虽然我可以找到许多有用的网格网格示例 但没有一个清楚地表明我如何将列表列表中的数据转换为可接受的形式 以适应我所讨论的各种方式 当谈到 numpy matplotlib 以及我所看到的建议的术语和步骤顺序时 我有点迷失 我
  • 如何以“正确”的方式处理带有空字节的 Python unicode 字符串?

    Question PyWin32 似乎很乐意将 null 终止的 unicode 字符串作为返回值 我想以 正确 的方式处理这些字符串 假设我得到一个像这样的字符串 u C Users Guest MyFile asy x00 x00sy
  • python 中的并行处理

    在 python 2 7 中进行并行处理的简单代码是什么 我在网上找到的所有示例都很复杂 并且包含不必要的代码 我该如何做一个简单的强力整数分解程序 在每个核心 4 上分解 1 个整数 我真正的程序可能只需要2个核心 并且需要共享信息 我知
  • Python 2.7 中的断言对我来说不起作用示例assertIn

    我的 Mac 上安装了 python 2 7 通过在终端中运行 python v 进行验证 当我尝试使用任何新的 2 7 断言方法时 我收到 AtributeError 我看过http docs python org 2 library u
  • 如果未引发异常,则通过 Python 单元测试

    在Python中unittest框架 是否有一种方法可以在未引发异常的情况下通过单元测试 否则会因 AssertRaise 而失败 如果我正确理解你的问题 你could做这样的事情 def test does not raise on va
  • 在没有模型的情况下将自定义页面添加到 django admin

    我正在尝试在没有模型关联的情况下向管理员添加自定义页面 这就是我迄今为止所取得的成就 class MyCustomAdmin AdminSite def get urls self from django conf urls import
  • Keras:如何保存模型或权重?

    如果这个问题看起来很简单 我很抱歉 但是阅读 Keras 保存和恢复帮助页面 https www tensorflow org beta tutorials keras save and restore models https www t
  • 在 Django OAuth Toolkit 中安全创建新应用程序

    如何将 IsAdminUser 权限添加到 Django OAuth Toolkit 中的 o applications 视图 REST FRAMEWORK DEFAULT PERMISSION CLASSES rest framework
  • 从扫描文档中提取行表 opencv python

    我想从扫描的表中提取信息并将其存储为 csv 现在我的表提取算法执行以下步骤 应用倾斜校正 应用高斯滤波器进行去噪 使用 Otsu 阈值进行二值化 进行形态学开局 Canny 边缘检测 进行霍夫变换以获得表格行 去除重复行 10像素范围内相
  • 在 Windows 上使用 apache mod_wsgi 运行 Flask 应用程序时导入冲突

    我允许您询问我在 Windows 上使用您的 mod wsgi portage 托管 Flask 应用程序时遇到的问题 我有两个烧瓶应用程序 由于导入冲突 只有一个可以同时存在 IE 如果请求申请 1 我有回复 然后 如果我请求应用程序 2
  • 使用Python计算目录的大小?

    在我重新发明这个特殊的轮子之前 有没有人有一个很好的例程来使用 Python 计算目录的大小 如果例程能够很好地以 Mb Gb 等格式格式化大小 那就太好了 这会遍历所有子目录 总结文件大小 import os def get size s
  • 用 python 编写的数学语法检查器

    我需要的只是使用 python 检查字符串是否是有效的数学表达式 为了简单起见 假设我只需要 运算符 也作为一元 带有数字和嵌套括号 为了完整性 我还添加了简单的变量名称 所以我可以这样测试 test 3 2 1 valid test 3
  • ANTLR 获取并拆分词法分析器内容

    首先 对我的英语感到抱歉 我还在学习 我为我的框架编写 Python 模块 用于解析 CSS 文件 我尝试了 regex ply python 词法分析器和解析器 但我发现自己在 ANTLR 中 第一次尝试 我需要解析 CSS 文件中的注释
  • SocketIO + Flask 检测断开连接

    我在这里有一个不同的问题 但意识到它可以简化为 如何检测客户端何时从页面断开连接 关闭其页面或单击链接 换句话说 套接字连接关闭 我想制作一个带有更新用户列表的聊天应用程序 并且我在 Python 上使用 Flask 当用户连接时 浏览器发
  • 混淆矩阵不支持多标签指示符

    multilabel indicator is not supported是我在尝试运行时收到的错误消息 confusion matrix y test predictions y test is a DataFrame其形状为 Horse
  • Django 与谷歌图表

    我试图让谷歌图表显示在我的页面上 但我不知道如何将值从 django 视图传递到 javascript 以便我可以绘制图表 姜戈代码 array Year Sales Expenses 2004 1000 400 2005 1170 460
  • 从 pandas DataFrame 中删除少于 K 个连续 NaN

    我正在处理时间序列数据 我在从数据帧列中删除小于或等于阈值的连续 NaN 时遇到问题 我尝试查看一些链接 例如 标识连续 NaN 出现的位置以及计数 Pandas NaN 孔的游程长度 https stackoverflow com que
  • 使用ssl和socket的python客户端身份验证

    我有一个 python 服务器 需要客户端使用证书进行身份验证 我如何制作一个客户端脚本 使用客户端证书由 python 中的服务器使用 ssl 和套接字模块进行身份验证 有没有仅使用套接字和 ssl 而不扭曲的示例 from OpenSS
  • 查找总和为给定数字的值组合的函数

    这个帖子查找提供的 Sum 值的组合 https stackoverflow com a 20194023 1561176呈现函数subsets with sum 它在数组中查找总和等于给定值的值的组合 但由于这个帖子已经有6年多了 我发这

随机推荐

  • SQL Server数据导入导出工具BCP详解

    bcp是SQL Server中负责导入导出数据的一个命令行工具 它是基于DB Library的 并且能以并行的方式高效地导入导出大批量的数据 bcp可以将数据库的表或视图直接导出 也能通过SELECT FROM语句对表或视图进行过滤后导出
  • 磁盘分区基础和LINUX上硬盘分区设备号解释

    现在就开始讲讲分区 先明确一下概念 主分区 一块物理硬盘上可以被独立使用的一部分 一个硬盘最多可以有4个主分区 扩展分区 为了突破一个物理硬盘只能有4个分区的限制 引入了扩展分区 扩展分区和主分区的地位相当 但是扩展分区本身不能被直接使用
  • linux之getopt 函数

    命令行参数解析函数 getopt getopt 函数声明如下 include
  • mysql日期相减取小时

    mysql日期相减取小时 TIMESTAMPDIFF HOUR a StartTime a EndTime 转载于 https www cnblogs com penghq p 8657064 html
  • 各国语言对应翻译表

    为了工作方便 自己做了一个地区语言的英文翻译 让自己可以更快的找到自己需要的地方 同时 分享给大家 谢谢 中文 各国语言 翻译 序号 中文 翻译 1 阿尔巴尼亚语 2 阿拉伯语 3 阿姆哈拉语 4 阿塞拜疆语 Az rbaycan 5 爱尔
  • 本地springboot项目上传到gitee

    1 在gitee上新建一个仓库 创建后可以拿到仓库地址 https gitee com ouyangshuiming linux test git 2 选中 创建git仓库 3 4 最后一步 一定记得这里要写上一段话 才能成功提交 比如gi
  • Elasticsearch的一些基本概念

    文章目录 基本概念 文档和索引 JSON文档 元数据 索引 REST API 节点和集群 节点 Master eligible节点和Master节点 Data Node 和 Coordinating Node 其它节点 分片 Primary
  • 如何找到电脑自带的浏览器

    1 找到电脑自带的浏览器 首先就是进入你的C盘 然后在C盘里找到自己的如下路径 C Program Files internet explorer 找到成功 完成
  • Conan

    环境 ubuntu bionic的docker image shell docker run it ubuntu bionic 预装工具 shell apt get install cmake 安装conan shell pip3 inst
  • ViT常见的模型规格以及源码记录

    ViT常见的模型规格以及源码记录 综述 介绍 网络结构 模型规格 源码实现 综述 论文题目 AN IMAGE IS WORTH 16X16 WORDS TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE
  • Java设计模式——单例模式(Singleton Pattern)

    从上一篇文章Java设计模式 装饰模式 Decorator Pattern 中估计大家都已经对java设计模式有了初步的理解 今天呢 阿Q就给大家讲一下另一种设计模式 单例设计模式 首先我们先来了解一下它的概念 单例模式是设计模式中最简单的
  • Java架构直通车——Java基础面试考点清单

    文章目录 基础 J U C jvm虚拟机 数据结构 算法 Spring RPC通信框架 网络通信 MQ 缓存 Mybatis 其他技术 基础 强引用 弱引用 虚引用 软引用 final关键字的作用 方法 变量 类 泛型 泛型继承 泛型擦除
  • 谷歌浏览器常用插件

    1 高对比度模式 调节流量器界面的颜色方案 挑选自己喜欢的效果 2 Pocket 将浏览过的网站收藏到这里 方便后续阅读 未完待续
  • python实现分页功能

    python实现分页功能 class Pagination def init self current page per page num 10 self per page num per page num if not current p
  • python画箱线图代码_箱线图(Python代码)

    箱线图 理论 懒得介绍了 用五位数描述数据 能够准确稳定地描绘出数据的离散分布情况 不受异常值影响 不能精确地衡量数据分布的偏态和尾重程度 对于批量比较大的数据 反映的信息更加模糊以及用中位数代表总体评价水平有一定的局限性 plt boxp
  • go 进阶 go-zero相关: 四. 服务注册原理

    目录 一 基础 二 resolver 服务注册底层原理 1 创建registerEtcd函数 并将该函数封装到keepAliveServer结构体中 2 执行registerEtcd函数实现服务注册 3 registerEtcd 服务注册详
  • 从编程角度看SSL协议(2)ssl库--SSLContext类

    1 SSLContext类介绍 ssl库中除了提供SSLSocket类以外 还提供了SSLContext类 相比于SSLSocket类 SSLContext提供了丰富的属性 供我们修改和查看SSL握手时的参数 我们可以通过以下命令来实例化S
  • vue day02 error

    搭建路由的时候出问题了 但是最后貌似没有报错 我估计是版本兼容的问题 目前项目运行时没问题 也显示安装成功 看看以后使用会不会出问题吧 C Users little shark Desktop project SPH app gt cnpm
  • uni-app实现再次返回退出应用时不退出应用而是在后台运行

    如果APP需要后台驻留 用户返回到首页时会提示退出操作 我们可以不退出而是隐藏至后台 这样的话APP就会在后台运行 以下代码须写在main js里面 弹出的内容可自定义设 置 ifdef APP PLUS let main plus and
  • Python 将控制台输出另存为日志文件

    文章目录 Python 将控制台输出另存为日志文件 需求 方法一 使用 Logger 类 推荐 方法二 仅使用 sys 方法三 使用 logging 模块 参考文献 Python 将控制台输出另存为日志文件 需求 在 PyCharm 中或者