Day 33:【99天精通Python】日志记录 (Logging) - 告别 Print 调试

Day 33:【99天精通Python】日志记录 (Logging) - 告别 Print 调试

前言

欢迎来到第33天!

在之前的编程练习中,当我们需要调试代码或者查看程序运行状态时,最常用的办法就是print()
但是在真正的项目开发(尤其是服务器后台、长时间运行的任务)中,print有很多严重的缺点:

  1. 无法持久化:关掉终端,信息就没了。
  2. 无法分级:满屏的输出,分不清哪些是重要的报错,哪些只是普通的调试信息。
  3. 缺少上下文:不知道这条信息是几点几分、在哪个文件的哪一行打印的。

Python 内置的logging模块提供了一套标准的日志记录系统。学会使用它,是你的代码走向专业化的重要标志。

本节内容:

  • 为什么不用print
  • 日志的 5 个级别
  • basicConfig快速配置
  • 日志格式化 (Formatter)
  • 进阶:同时输出到控制台和文件
  • 实战练习:打造一个生产级日志系统

一、日志的 5 个级别 (Levels)

logging模块定义了 5 个标准级别,严重程度递增。我们可以根据需要选择记录哪个级别的信息。

级别数值描述适用场景
DEBUG10调试细节只有开发人员关心,如变量的值、循环进度。
INFO20正常信息确认程序按预期运行,如"服务启动"、“任务开始”。
WARNING30警告 (默认)出现意外但暂不影响运行,如"磁盘空间不足"。
ERROR40错误某个功能执行失败,如"文件未找到"、“连接超时”。
CRITICAL50严重错误程序可能崩溃,无法继续运行。

注意:默认级别是WARNING。这意味着 DEBUG 和 INFO 级别的信息默认不会被打印出来。


二、快速上手:basicConfig

2.1 最简单的用法

importlogging# 默认只会打印 WARNING 及以上级别logging.debug("这是调试信息")# 不显示logging.info("这是普通信息")# 不显示logging.warning("这是警告信息")# 显示: WARNING:root:这是警告信息logging.error("这是错误信息")# 显示logging.critical("这是严重错误")# 显示

2.2 配置日志 (保存到文件 + 修改级别)

使用logging.basicConfig()可以对系统进行初始化设置。

importlogging# 配置日志logging.basicConfig(filename='app.log',# 指定输出文件 (如果不写,默认输出到控制台)filemode='a',# 模式: 'w'覆盖, 'a'追加 (默认是a)level=logging.INFO,# 设置最低显示级别为 INFOformat='%(asctime)s - %(levelname)s - %(message)s',# 自定义格式encoding='utf-8'# 防止中文乱码 (Python 3.9+))logging.info("程序启动了...")logging.warning("磁盘空间低于 10%")logging.error("数据库连接失败!")

运行后,app.log文件内容:

2026-02-01 10:00:01,123 - INFO - 程序启动了... 2026-02-01 10:00:01,125 - WARNING - 磁盘空间低于 10% 2026-02-01 10:00:01,126 - ERROR - 数据库连接失败!

2.3 常用格式化字段

format参数中可以使用以下占位符:

  • %(asctime)s: 时间 (默认精确到毫秒)
  • %(levelname)s: 日志级别名称 (INFO, ERROR…)
  • %(message)s: 日志内容
  • %(filename)s: 调用日志的文件名
  • %(lineno)d: 代码行号
  • %(threadName)s: 线程名

三、进阶:Logger, Handler, Formatter

basicConfig虽然简单,但功能有限(例如:它很难实现"同时输出到控制台和文件")。
Python 的 logging 系统采用了模块化设计,由四大组件组成:

  1. Logger (记录器):程序直接调用的接口。
  2. Handler (处理器):决定把日志发到哪里(屏幕、文件、邮件…)。
  3. Formatter (格式化器):决定日志长什么样。
  4. Filter (过滤器):决定哪些日志要输出(较少用)。

实战:同时输出到屏幕和文件

这是开发中最常用的配置。

importlogging# 1. 创建 Loggerlogger=logging.getLogger("MyProject")logger.setLevel(logging.DEBUG)# 设置全局最低级别# 2. 创建 Handlers# StreamHandler: 输出到控制台 (屏幕)console_handler=logging.StreamHandler()console_handler.setLevel(logging.WARNING)# 屏幕只显示警告及以上# FileHandler: 输出到文件file_handler=logging.FileHandler("app_detail.log",encoding='utf-8')file_handler.setLevel(logging.DEBUG)# 文件记录所有细节# 3. 创建 Formattersfmt_simple=logging.Formatter('%(levelname)s: %(message)s')fmt_detail=logging.Formatter('%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')# 4. 给 Handlers 绑定 Formatterconsole_handler.setFormatter(fmt_simple)file_handler.setFormatter(fmt_detail)# 5. 给 Logger 添加 Handlerslogger.addHandler(console_handler)logger.addHandler(file_handler)# --- 测试使用 ---logger.debug("这是一条调试信息 (只会进文件)")logger.info("程序运行正常 (只会进文件)")logger.warning("注意!这里有个隐患 (屏幕+文件)")logger.error("出错了!(屏幕+文件)")

效果

  • 屏幕上:只看到清爽的警告和错误信息。
  • 文件中:记录了详尽的调试信息,方便事后排查。

四、捕获异常堆栈 (Traceback)

当程序崩溃捕获异常时,我们希望日志能记录下完整的报错堆栈信息,而不仅仅是一句"出错了"。
使用exc_info=True参数。

try:1/0exceptZeroDivisionError:# 错误写法:只记录了一句话,不知道哪一行错# logging.error("除数不能为0")# 正确写法:记录完整堆栈logging.error("发生了一个错误",exc_info=True)# 或者用更简单的写法 (仅在 except 块中有效)# logging.exception("发生了一个错误")

日志输出

ERROR:root:发生了一个错误 Traceback (most recent call last): File "test.py", line 2, in <module> 1 / 0 ZeroDivisionError: division by zero

五、日志轮转 (Rotating Logs)

如果系统一直运行,日志文件会越来越大,最后把磁盘塞满。
我们需要日志轮转:比如每 10MB 切割一个新文件,或者每天生成一个新文件。

fromlogging.handlersimportRotatingFileHandler# 定义一个 10MB 大小的 handler,最多保留 5 个备份# 当 log.txt 满了,会重命名为 log.txt.1, log.txt.2 ...handler=RotatingFileHandler('app.log',maxBytes=10*1024*1024,# 10MBbackupCount=5,encoding='utf-8')# 剩下的配置同上...

六、小结

日志系统 Logging

Logger (记录器)

Handler (处理器)

Formatter (格式化)

Output (输出)

StreamHandler (屏幕)

FileHandler (文件)

RotatingFileHandler (轮转)

%(asctime)s

%(levelname)s

%(message)s

Console

app.log

关键要点

  1. 别再用 Print 了:除非是临时调试,否则请使用 Logging。
  2. 级别管理:开发用 DEBUG/INFO,生产环境用 WARNING/ERROR。
  3. 异常记录:在except块中用logging.exception()自动保存堆栈信息。
  4. 模块化:在不同的模块中,使用logger = logging.getLogger(__name__)获取独立的记录器。

七、课后作业

  1. 日志封装:编写一个MyLogger类,封装上述的"屏幕+文件"双重输出逻辑。调用时只需要log = MyLogger("test.log"),然后log.info(...)即可。
  2. 异常捕获器:结合装饰器知识,编写一个@catch_error装饰器。如果被装饰的函数报错,自动将错误堆栈写入日志文件,而不是让程序崩溃。
  3. 计算器升级:将之前的计算器程序升级,记录用户的每一次操作(如 “User calculated 1+1=2”)到calc.log文件中。

下节预告

Day 34:单元测试 (Unittest)- 写好的代码怎么保证没 Bug?靠人工点点点太慢了。明天我们学习如何编写自动化测试脚本,让代码自己测自己!


系列导航

  • 上一篇:Day 32 - 打包发布PyInstaller
  • 下一篇:Day 34 - 单元测试Unittest(待更新)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1156001.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux驱动开发八股文:工作队列(Workqueue)

&#x1f4da; Linux 驱动开发笔记&#xff1a;工作队列 (Workqueue) 一、 核心定义 工作队列是 Linux 内核中断下半部&#xff08;Bottom Half&#xff09;的一种重要机制。它允许你将耗时的、需要等待资源或可能导致休眠的任务&#xff0c;从中断处理函数&#xff08;ISR&…

Linux应用与驱动开发:mmap和内存映射

学习笔记&#xff1a;Linux 驱动开发之 mmap 与内存映射 1. 核心概念&#xff1a;什么是 mmap&#xff1f; mmap (Memory Map) 是一种内存映射文件的方法。在嵌入式 Linux 驱动开发中&#xff0c;它主要用于将外设的物理地址&#xff08;如 GPIO 寄存器&#xff09;映射到用户进…

Day 34:【99天精通Python】单元测试 (Unittest) - 给代码上个保险

Day 34&#xff1a;【99天精通Python】单元测试 (Unittest) - 给代码上个保险 前言 欢迎来到第34天&#xff01; 在之前的开发中&#xff0c;我们通常是怎么验证代码对不对的&#xff1f; —— 写完代码&#xff0c;手动运行一下&#xff0c;输入几个参数&#xff0c;看看打印结…

Day 35:【99天精通Python】综合实战 - 爬虫与数据分析可视化(上) - 数据采集与入库

Day 35&#xff1a;【99天精通Python】综合实战 - 爬虫与数据分析可视化(上) - 数据采集与入库 前言 欢迎来到第35天&#xff01; 经过前两周的学习&#xff0c;我们已经掌握了网络请求&#xff08;Requests&#xff09;、网页解析&#xff08;BeautifulSoup&#xff09;、数…

多FDCAN接口同步配置实战:双通道并行通信实现

多FDCAN接口实战&#xff1a;双通道并行通信如何突破带宽瓶颈你有没有遇到过这样的情况&#xff1f;在开发一个高实时性的车载控制模块时&#xff0c;CAN总线突然“卡顿”——数据延迟飙升、报文丢失频发。排查一圈后发现&#xff0c;并不是硬件故障&#xff0c;而是单条CAN通道…

强烈安利10个AI论文软件,MBA毕业论文轻松搞定!

强烈安利10个AI论文软件&#xff0c;MBA毕业论文轻松搞定&#xff01; AI 工具如何让论文写作更高效&#xff1f; 在当前的学术环境中&#xff0c;MBA 学生和研究者们正面临越来越多的挑战。从选题到撰写&#xff0c;再到查重与修改&#xff0c;每一个环节都可能成为耗时费力的…

Figma中文界面本地化:设计师专属的语言解决方案

Figma中文界面本地化&#xff1a;设计师专属的语言解决方案 【免费下载链接】figmaCN 中文 Figma 插件&#xff0c;设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 语言障碍的痛点与解决方案 对于国内设计从业者而言&#xff0c;Figma作为专…

Day 36:【99天精通Python】综合实战 - 爬虫与数据分析可视化(下) - 让数据“说话“

Day 36&#xff1a;【99天精通Python】综合实战 - 爬虫与数据分析可视化(下) - 让数据"说话" 前言 欢迎来到第36天&#xff01; 在昨天&#xff08;Day 35&#xff09;的课程中&#xff0c;我们化身为"数据采集员"&#xff0c;成功编写爬虫抓取了豆瓣 Top2…

导师推荐!8个AI论文平台测评:研究生开题报告全攻略

导师推荐&#xff01;8个AI论文平台测评&#xff1a;研究生开题报告全攻略 学术写作工具测评&#xff1a;为什么需要一份精准的AI论文平台榜单 在研究生阶段&#xff0c;开题报告和论文撰写是科研工作的核心环节&#xff0c;而高效、专业的写作工具能显著提升研究效率与成果质…

Intel平台嵌入式SPI通信:新手教程

Intel平台嵌入式SPI通信&#xff1a;从零理解eSPI的实战指南你有没有遇到过这样的情况&#xff1f;在调试一块工业主板时&#xff0c;发现电源键按下后系统无法唤醒&#xff1b;或者在做低功耗设计时&#xff0c;明明进入了S3睡眠&#xff0c;传感器数据却断了传输。这些问题的…

Doris与Trino集成:统一SQL大数据查询引擎

Doris与Trino集成:统一SQL大数据查询引擎 关键词:Doris、Trino、SQL查询引擎、大数据分析、数据仓库、联邦查询、OLAP 摘要:本文深入探讨了Apache Doris与Trino两大流行SQL查询引擎的集成方案,旨在构建统一的大数据查询平台。文章首先分析了两者的架构特点和互补优势,然后…

Day 38:【99天精通Python】线程池与进程池 - 优雅地管理并发

Day 38&#xff1a;【99天精通Python】线程池与进程池 - 优雅地管理并发 前言 欢迎来到第38天&#xff01; 在 Day 24 和 Day 25 中&#xff0c;我们学习了如何手动创建线程 (threading.Thread) 和进程 (multiprocessing.Process)。虽然原理都懂了&#xff0c;但在实际工程中&a…

“死了么”App爆火,我发现了个安卓版,代码开源!

最近看到一个特别搞笑的评论&#xff1a; 当代年轻人日常&#xff1a;用「饿了么」填饱肚子&#xff0c;「死了么」证明还活着 &#x1f602; 随着前几天「死了么」APP 爆火&#xff0c;网上的段子手们就没停下来过&#xff0c;哈哈哈哈哈 iPhone版 「死了么」是iPhone手机上…

Figma中文插件完全配置指南:告别英文界面困扰

Figma中文插件完全配置指南&#xff1a;告别英文界面困扰 【免费下载链接】figmaCN 中文 Figma 插件&#xff0c;设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma复杂的英文界面而头疼吗&#xff1f;面对专业设计工具&#xff0c;…

基于YOLOv8的小麦田间病害识别项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!

基于YOLOv8的小麦田间病害识别项目&#xff5c;完整源码数据集PyQt5界面完整训练流程开箱即用&#xff01; 源码包含&#xff1a;完整YOLOv8训练代码数据集(带标注)权重文件直接可允许检测的yolo检测程序直接部署教程/训练教程 基本功能演示 源码在文末哔哩哔哩视频简介处获…

基于Simulink的混合PO与INC切换MPPT策略仿真

目录 手把手教你学Simulink 一、引言&#xff1a;为什么需要“混合P&O与INC”&#xff1f; 二、系统整体架构 控制流程&#xff1a; 三、核心算法详解 1. P&O 算法&#xff08;扰动观察法&#xff09; 2. INC 算法&#xff08;电导增量法&#xff09; 3. 光照突…

多语言界面在screen中的实现:项目应用

用 GNU Screen 构建轻量级多语言终端界面&#xff1a;从原理到实战你有没有遇到过这样的场景&#xff1f;一位中国工程师深夜远程连接非洲基站的工控设备&#xff0c;刚准备执行配置命令时断网了。几小时后重新登录&#xff0c;发现之前的调试流程全中断了——日志没了、上下文…

学长亲荐8个一键生成论文工具,专科生毕业论文必备!

学长亲荐8个一键生成论文工具&#xff0c;专科生毕业论文必备&#xff01; AI 工具让论文写作不再难 在当前的学术环境中&#xff0c;AI 工具已经成为许多学生和研究者不可或缺的助手。尤其是对于专科生而言&#xff0c;面对繁重的毕业论文任务&#xff0c;如何高效地完成内容撰…

Figma中文界面终极解决方案:5分钟完成专业设计工具全面汉化

Figma中文界面终极解决方案&#xff1a;5分钟完成专业设计工具全面汉化 【免费下载链接】figmaCN 中文 Figma 插件&#xff0c;设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma英文操作界面而困扰&#xff1f;想要快速掌握这款国际…

基于Simulink的多时间常数储能配置优化仿真

手把手教你学Simulink--基础储能管理场景实例&#xff1a;基于Simulink的多时间常数储能配置优化仿真 手把手教你学Simulink ——基础储能管理场景实例&#xff1a;基于Simulink的多时间常数储能配置优化仿真 一、引言&#xff1a;为什么需要“多时间常数储能”&#xff1f; …