Python logging模块从入门到精通:告别print,构建专业日志系统

发布时间:2026/7/31 5:31:37

Python logging模块从入门到精通:告别print,构建专业日志系统
在Python开发中很多初学者习惯用print()来调试和记录程序运行状态。但当你进入生产环境或者项目规模变大时print()的局限性就完全暴露出来了❌ 无法区分日志的重要程度❌ 不能灵活控制输出开发环境输出全部生产环境只输出错误❌ 无法将日志持久化保存到文件❌ 多模块项目中难以追踪日志来源❌ 不能按时间或大小自动分割日志文件今天我将带你全面掌握Python标准库中的logging模块从最基础的概念到实际项目中的应用让你彻底告别print()一、logging模块快速入门1.1 最简单的使用方式import logging # 配置基础日志设置 logging.basicConfig(levellogging.DEBUG) # 记录不同级别的日志 logging.debug(这是debug级别的日志) logging.info(这是info级别的日志) logging.warning(这是warning级别的日志) logging.error(这是error级别的日志) logging.critical(这是critical级别的日志)1.2 日志级别详解logging模块定义了5个标准日志级别从低到高级别数值使用场景DEBUG10详细的调试信息只在开发阶段使用INFO20程序正常运行的关键节点信息WARNING30程序仍能运行但需要注意的异常情况ERROR40程序某些功能无法执行但整体未崩溃CRITICAL50严重错误程序可能无法继续运行import logging # 设置日志级别为WARNING logging.basicConfig(levellogging.WARNING) # DEBUG和INFO级别低于WARNING不会输出 logging.debug(这条不会显示) logging.info(这条也不会显示) # WARNING及以上级别会输出 logging.warning(这条会显示) # 输出 logging.error(这条会显示) # 输出 logging.critical(这条会显示) # 输出二、配置日志格式2.1 自定义日志格式默认的日志格式不够友好我们可以自定义格式import logging logging.basicConfig( levellogging.DEBUG, format%(asctime)s - %(levelname)s - %(message)s, datefmt%Y-%m-%d %H:%M:%S ) logging.info(程序启动成功) logging.warning(磁盘空间不足) 2026-07-30 15:30:45 - INFO - 程序启动成功 2026-07-30 15:30:45 - WARNING - 磁盘空间不足2.2 常用格式化字段字段说明示例值%(asctime)s日志记录时间2026-07-30 15:30:45%(levelname)s日志级别名称INFO%(message)s日志消息内容程序启动成功%(name)s日志记录器名称root%(filename)s文件名main.py%(lineno)d行号25%(funcName)s函数名main%(process)d进程ID12345%(thread)d线程ID67890%(pathname)s文件完整路径/app/main.py%(module)s模块名main%(created)f创建时间戳浮点数1681234567.892.3 生产环境推荐的格式import logging logging.basicConfig( levellogging.INFO, format[%(asctime)s] [%(levelname)s] [%(filename)s:%(lineno)d] %(message)s, datefmt%Y-%m-%d %H:%M:%S ) def process_data(): logging.info(开始处理数据) logging.warning(数据量超过阈值) process_data() [2026-07-30 15:30:45] [INFO] [main.py:12] 开始处理数据 [2026-07-30 15:30:45] [WARNING] [main.py:13] 数据量超过阈值三、日志输出到文件3.1 基础文件输出import logging logging.basicConfig( levellogging.DEBUG, format%(asctime)s - %(levelname)s - %(message)s, datefmt%Y-%m-%d %H:%M:%S, filenameapp.log, # 指定日志文件 filemodew # w覆盖写入a追加默认 ) logging.info(程序启动) logging.error(发生错误) logging.info(程序结束) 2026-07-30 15:30:45 - INFO - 程序启动 2026-07-30 15:30:45 - ERROR - 发生错误 2026-07-30 15:30:45 - INFO - 程序结束3.2 同时输出到控制台和文件import logging # 创建日志记录器 logger logging.getLogger(my_app) logger.setLevel(logging.DEBUG) # 创建控制台处理器 console_handler logging.StreamHandler() console_handler.setLevel(logging.INFO) # 创建文件处理器 file_handler logging.FileHandler(app.log, encodingutf-8) file_handler.setLevel(logging.DEBUG) # 设置日志格式 formatter logging.Formatter( %(asctime)s - %(levelname)s - %(message)s, datefmt%Y-%m-%d %H:%M:%S ) console_handler.setFormatter(formatter) file_handler.setFormatter(formatter) # 添加处理器到日志记录器 logger.addHandler(console_handler) logger.addHandler(file_handler) # 使用日志 logger.debug(调试信息只在文件中有) logger.info(普通信息控制台和文件都有) logger.warning(警告信息控制台和文件都有) logger.error(错误信息控制台和文件都有)输出效果控制台显示INFO及以上级别的日志文件显示DEBUG及以上级别的所有日志四、Logger对象的使用4.1 为什么使用Logger对象在前面的例子中我们直接使用logging.info()等函数这实际上使用的是根日志记录器root logger。但在大型项目中我们通常为每个模块创建独立的Logger对象以便更好地控制日志。4.2 创建和使用Loggerimport logging # 创建名为 my_module 的日志记录器 logger logging.getLogger(my_module) logger.setLevel(logging.DEBUG) # 添加处理器 handler logging.StreamHandler() handler.setLevel(logging.DEBUG) formatter logging.Formatter(%(name)s - %(levelname)s - %(message)s) handler.setFormatter(formatter) logger.addHandler(handler) # 使用Logger logger.debug(调试信息) logger.info(普通信息) logger.warning(警告信息) my_module - DEBUG - 调试信息 my_module - INFO - 普通信息 my_module - WARNING - 警告信息4.3 使用__name__的最佳实践在Python中推荐使用__name__作为Logger的名称# 在 mymodule.py 中 import logging logger logging.getLogger(__name__) # 使用 __name__ def do_something(): logger.info(执行某个操作) try: # 业务代码 pass except Exception as e: logger.error(f操作失败{e})为什么使用__name____name__会自动反映模块的完整导入路径例如mypackage.mymodule这样你可以针对不同包设置不同的日志级别4.4 日志传播机制Logger之间存在层级关系子Logger的日志默认会向上传播给父Logger。import logging # 创建父Logger parent logging.getLogger(parent) parent.setLevel(logging.INFO) handler logging.StreamHandler() handler.setFormatter(logging.Formatter(%(name)s - %(message)s)) parent.addHandler(handler) # 创建子Logger child logging.getLogger(parent.child) child.setLevel(logging.DEBUG) # 子Logger的日志会传播到父Logger child.info(这条信息会显示) # 父Logger会处理 child.debug(调试信息不会显示) # 父Logger级别是INFO不会显示 # 阻止传播 child.propagate False child.info(这条信息只由自己处理不会传播到父Logger)

相关新闻

嵌入式系统多芯片协作:从单片机到双片机架构设计实践

嵌入式系统多芯片协作:从单片机到双片机架构设计实践

2026/7/31 5:31:37

这次我们来聊聊一个有趣的技术问题:我们都知道单片机,那有没有"双片机"呢?先说结论:从严格的技术定义来说,并没有"双片机"这个标准术语。单片机(Microcontroller Unit, MCU&#xff09…

基于粒子群算法的无人机区域覆盖路径规划MATLAB实现

基于粒子群算法的无人机区域覆盖路径规划MATLAB实现

2026/7/31 5:31:37

1. 项目背景与核心问题无人机区域覆盖巡检是工业检测、农业监测、安防巡逻等领域的常见需求。想象一下,我们需要用无人机检查一片太阳能电池板阵列,或者巡查一片农田的生长情况。如何规划无人机的飞行路径,才能确保每个角落都被覆盖到&#x…

Beta分布原理与应用:从概率建模到点击率预测

Beta分布原理与应用:从概率建模到点击率预测

2026/7/31 5:31:37

1. Beta分布初探:从抛硬币到用户点击率预测第一次接触Beta分布是在优化广告点击率模型时。当时团队需要建模用户点击概率,传统二项分布无法表达我们对参数的不确定性,而Beta分布完美解决了这个问题——它不仅能描述概率本身,还能刻…

img2threejs 架构深度解析:AI 如何高效地从图片“雕刻“3D 模型

img2threejs 架构深度解析:AI 如何高效地从图片“雕刻“3D 模型

2026/7/31 6:11:38

本文是 img2threejs 系列的第二篇,深入剖析其管线架构设计、质量门控机制、以及"确定性脚本 AI 视觉判断"的 Token 高效利用策略。前言 上一篇我们介绍了 img2threejs 的基本概念和使用方式。这篇文章我们深入它的内部架构——它是如何在保证模型质量的同…

应急指挥中心的视频方案选型,要注意什么?

应急指挥中心的视频方案选型,要注意什么?

2026/7/31 6:11:38

应急指挥中心是跨部门、跨层级的信息交互中枢。消防、公安、应急、医疗、气象多支队伍同时在线;省、市、县、乡镇多级联动;前方现场、后方大厅、远程专家的画面和声音都要在这里汇聚、同步、决策。这里的摄像机,不是录个像就完事了&#xff0…

基于Hadoop大数据的电子健康信息记录分析系统的设计与实现大数据分析系统(源码+lw+部署文档+讲解等)

基于Hadoop大数据的电子健康信息记录分析系统的设计与实现大数据分析系统(源码+lw+部署文档+讲解等)

2026/7/31 6:11:38

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

拆卡系统技术解析:从随机算法到高并发架构的设计实践

拆卡系统技术解析:从随机算法到高并发架构的设计实践

2026/7/31 6:11:38

最近在逛技术社区时,发现一个有趣的现象:越来越多的开发者开始用"拆卡"这种形式来管理自己的技术学习路径。这让我想起了小时候收集小浣熊水浒卡的经历,只不过现在我们把这种收集和拆解的乐趣用在了更硬核的技术领域。今天要聊的&q…

3分钟掌握浏览器Cookie本地安全导出:Get cookies.txt LOCALLY完整指南

3分钟掌握浏览器Cookie本地安全导出:Get cookies.txt LOCALLY完整指南

2026/7/31 6:11:38

3分钟掌握浏览器Cookie本地安全导出:Get cookies.txt LOCALLY完整指南 【免费下载链接】Get-cookies.txt-LOCALLY Get cookies.txt, NEVER send information outside. 项目地址: https://gitcode.com/gh_mirrors/ge/Get-cookies.txt-LOCALLY 你是否经常需要在…

STM32驱动8080接口屏幕:FSMC配置与调试避坑指南

STM32驱动8080接口屏幕:FSMC配置与调试避坑指南

2026/7/31 6:01:38

1. 从“点不亮”到“看得见”:为什么8080接口是STM32驱动屏幕的基石最近在论坛和群里,看到不少朋友在折腾STM32驱动屏幕,尤其是那种带“HUB接口”或者“8080接口”的屏幕。最常见的问题就是:“屏幕怎么点不亮?”、“初…

[具身智能-649]:个人电脑搭建 RTSP 服务完整方案(Windows / Ubuntu 双平台,适配 RDK X5 rtsp2display 调试)

[具身智能-649]:个人电脑搭建 RTSP 服务完整方案(Windows / Ubuntu 双平台,适配 RDK X5 rtsp2display 调试)

2026/7/30 9:53:22

目标:电脑作为RTSP 服务端,循环推送 H264/H265 视频流; RDK X5 通过 rtsp2display 拉流预览,完全不需要在开发板编译 live555。 提供两套成熟方案: ✅ 方案 A:FFmpeg(最简单,优先推…

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

2026/7/30 1:17:46

一、背景与测试方案 在实际项目交付中,PDF文件合并与版权保护水印的叠加是一个高频但容易被低估的技术需求。典型的处理链路涉及:多源PDF的文件流合并、页面级水印渲染(含透明度混合与图层叠加)、输出文件体积控制。看似简单的操作…

PDF拆分压完图糊了?2026国内免费实测,档案员都在用的组合方案

PDF拆分压完图糊了?2026国内免费实测,档案员都在用的组合方案

2026/7/30 2:52:37

说实话,提到PDF拆分再压缩,我真是被折腾得够呛。 上个月公司年度合同归档,一份300多页的PDF总合同,需要按年份拆分成三个独立文件,再分别压缩到10MB以内方便邮件发送各部门确认。我心想这还不简单?先找个海…

2026优质EMBA择校榜单:校友圈质量高的EMBA适配民企创始人

2026优质EMBA择校榜单:校友圈质量高的EMBA适配民企创始人

2026/7/31 0:01:23

【客观独立测评】深耕商科教育测评多年,聚焦民企创始人、科创企业实控人择校痛点,避开镀金空壳、课程脱节、圈层杂乱的踩坑问题,结合真实办学数据与学员口碑,整理出适配实业高管的高性价比EMBA榜单,理性分析各项目适配…

绝区零一条龙:5分钟快速上手的终极自动化助手

绝区零一条龙:5分钟快速上手的终极自动化助手

2026/7/31 0:01:23

绝区零一条龙:5分钟快速上手的终极自动化助手 【免费下载链接】ZenlessZoneZero-OneDragon 绝区零 一条龙 | 全自动 | 自动闪避 | 自动每日 | 自动空洞 | 支持手柄 项目地址: https://gitcode.com/gh_mirrors/ze/ZenlessZoneZero-OneDragon 绝区零一条龙是一…

2026民企老板EMBA择校榜单:人脉圈广的EMBA高性价比测评

2026民企老板EMBA择校榜单:人脉圈广的EMBA高性价比测评

2026/7/31 0:01:23

【客观中立测评声明】本文基于学费成本、课程落地、圈层纯度、长期赋能四大维度实测打分,无商业洗脑吹捧,仅为民企创始人、科创高管提供真实择校参考,规避镀金踩坑陷阱。不少民营企业家读EMBA容易踩两大坑:盲目追名校排名&#xf…