拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Python进阶教程:30_logging 模块 零基础超详细教程

logging是 Python内置标准日志模块不需要 pip 安装。简单讲代替print()做程序输出。print只会简单打印到控制台logging可以分级输出、同时打印控制台 写入日志文件、记录时间、报错堆栈、按大小切割日志、关闭调试信息是项目开发必备。新手误区写脚本不要一直用 print正式代码要用 logging 日志。一、日志 5 个级别从低到高级别越大越严重设置级别后只有大于等于该级别的日志才会输出级别数值作用DEBUG10调试信息程序细节开发时看INFO20普通运行信息程序正常执行记录WARNING30警告不崩溃但需要注意ERROR40错误部分功能失败CRITICAL50严重致命错误程序可能退出举例如果设置级别levellogging.INFODEBUG (10) 会被过滤不输出INFO、WARNING、ERROR、CRITICAL 全部输出二、最简单入门示例import logging # 配置日志设置最低输出级别 logging.basicConfig(levellogging.DEBUG) # 5种日志输出 logging.debug(这是debug调试信息) logging.info(这是info普通信息) logging.warning(这是warning警告) logging.error(这是error错误) logging.critical(这是critical致命错误)输出DEBUG:root:这是debug调试信息 INFO:root:这是info普通信息 WARNING:root:这是warning警告 ERROR:root:这是error错误 CRITICAL:root:这是critical致命错误解释logging.basicConfig()简单一次性配置日志levellogging.DEBUG显示 DEBUG 及以上全部等级输出格式级别:日志器名称:日志内容root 代表根日志器如果你改成levellogging.WARNINGdebug、info 就不会打印。import logging logging.basicConfig(levellogging.WARNING) logging.info(我是info) # 不会输出 logging.warning(我是警告) # 输出三、自定义日志格式输出时间、级别format参数自定义日志输出模板常用占位符占位符含义%(asctime)s日志发生时间%(levelname)s日志级别名称%(message)s日志消息内容%(filename)s当前文件名%(lineno)d报错所在行号示例带时间、级别、行号打印import logging logging.basicConfig( levellogging.DEBUG, format%(asctime)s | %(levelname)s | %(filename)s:%(lineno)d | %(message)s, datefmt%Y-%m-%d %H:%M:%S # asctime的时间格式 ) logging.info(程序启动成功) logging.warning(配置文件不存在使用默认配置)输出示例2026-08-19 10:20:30 | INFO | test.py:10 | 程序启动成功 2026-08-19 10:20:30 | WARNING | test.py:11 | 配置文件不存在使用默认配置解释datefmt控制时间显示样式不写会显示默认时间格式%(lineno)d可以看到日志写在哪一行调试非常方便四、同时输出到控制台 写入日志文件filenamexxx.log参数日志保存到磁盘文件。import logging logging.basicConfig( levellogging.INFO, filenameapp.log, # 日志写入这个文件 filemodea, # a追加w覆盖重写 format%(asctime)s %(levelname)s %(message)s, datefmt%Y-%m-%d %H:%M:%S ) logging.info(服务启动) logging.error(数据库连接失败)⚠️ 坑使用filename后默认不再打印控制台只写文件。 如果既要屏幕打印又写文件basicConfig做不到要用后面讲解的 Handler。filemodea每次运行程序日志追加到文件末尾filemodew每次运行清空旧日志重新写不推荐会丢历史日志。打开app.log文件就能看到全部日志。五、捕获异常打印完整错误堆栈重点logging.error()不会自动打印报错堆栈 使用logging.exception()会自动记录完整异常信息包括报错行、调用栈只放在except里面使用。import logging logging.basicConfig(levellogging.ERROR, format%(asctime)s %(message)s) def div(a,b): return a / b try: div(10, 0) except ZeroDivisionError: # exception 必须放在except块内自动抓取异常信息 logging.exception(执行除法发生错误)输出会包含完整堆栈2026-08-19 10:30:00 执行除法发生错误 Traceback (most recent call last): File test.py, line 8, in module div(10,0) File test.py, line5, in div return a/b ZeroDivisionError: division by zero对比logging.error(执行除法发生错误)只会打印一句话看不到堆栈排查问题很难。捕获异常优先用 logging.exception ()六、高级Handler 处理器真正项目使用方式basicConfig只适合简单脚本正式项目使用 Logger Handler。概念通俗理解Logger 日志器日志入口我们调用logger.info()Handler 处理器决定日志输出去哪里可以多个StreamHandler输出控制台屏幕FileHandler输出到普通日志文件RotatingFileHandler按文件大小切割日志TimedRotatingFileHandler按时间切割日志每天生成一个日志文件Formatter 格式器定义日志字符串格式一个 Logger 可以挂载多个 Handler实现同时输出屏幕、同时写文件。示例同时控制台打印 写入文件import logging # 1. 创建日志器推荐给名字不要直接用root logger logging.getLogger(my_app) logger.setLevel(logging.DEBUG) # 设置日志器总级别 # 防止重复输出新手高频坑 if not logger.handlers: # 2. 定义格式 log_format logging.Formatter( %(asctime)s | %(levelname)s | %(message)s, datefmt%Y-%m-%d %H:%M:%S ) # 3. Handler1控制台输出 stream_handler logging.StreamHandler() stream_handler.setFormatter(log_format) stream_handler.setLevel(logging.DEBUG) # 4. Handler2输出文件 file_handler logging.FileHandler(run.log, encodingutf-8) file_handler.setFormatter(log_format) file_handler.setLevel(logging.INFO) # 5. 把handler添加到logger logger.addHandler(stream_handler) logger.addHandler(file_handler) # 使用日志器 logger.debug(调试信息只在控制台显示) logger.info(程序启动完成) logger.warning(磁盘空间不足警告)重点解释logging.getLogger(my_app)获取日志实例不同模块可以通过同一个名字拿到同一个日志对象。if not logger.handlers:防止重复添加 handler否则日志会重复打印多遍新手高频踩坑。handler 可以单独设置级别控制台可以看 DEBUG 细节文件只记录 INFO 以上减少日志文件体积encodingutf-8写中文日志不乱码Windows 一定要加注意之后不要写logging.info()要用logger.info()。七、日志切割RotatingFileHandler 按大小分割日志日志文件会越变越大我们希望文件到一定大小新建日志文件保留几个旧日志。import logging from logging.handlers import RotatingFileHandler logger logging.getLogger(demo) logger.setLevel(logging.INFO) if not logger.handlers: fmt logging.Formatter(%(asctime)s %(levelname)s %(message)s) # 每个日志最大5MB最多保留3个备份 file_handler RotatingFileHandler( size_log.log, maxBytes5 * 1024 * 1024, # 5MB backupCount3, encodingutf-8 ) file_handler.setFormatter(fmt) logger.addHandler(file_handler) for i in range(1000): logger.info(f测试日志 {i})参数说明maxBytes单个文件到达这个字节就自动切分backupCount3最多保存 3 个历史文件size_log.log.1、size_log.log.2、size_log.log.3旧的自动删除。八、按时间切割日志 TimedRotatingFileHandler生产环境最常用每天生成一份日志文件。import logging from logging.handlers import TimedRotatingFileHandler logger logging.getLogger(app) logger.setLevel(logging.INFO) if not logger.handlers: fmt logging.Formatter(%(asctime)s %(levelname)s %(message)s) # whenD 按天切割H小时M分钟 handler TimedRotatingFileHandler( day_log.log, whenD, backupCount7, # 保留最近7天日志 encodingutf-8 ) handler.setFormatter(fmt) logger.addHandler(handler) logger.info(每日日志测试)whenD每天生成一个日志backupCount7只保留 7 天更早自动清理防止硬盘占满九、日志输出变量和字符串格式化一样可以嵌入变量import logging logging.basicConfig(levellogging.INFO) name 小明 age 20 logging.info(用户姓名%s年龄%d, name, age) # f-string写法也可以 logging.info(f用户姓名{name}年龄{age})十、新手高频踩坑总结❌ 多次调用basicConfig不生效basicConfig只有第一次调用生效后面调用无效。复杂项目直接用 Logger Handler。❌ 日志重复打印很多行重复 addHandler增加判断if not logger.handlers:❌ 日志文件中文乱码FileHandler 增加encodingutf-8❌ 异常看不到堆栈except 里面使用logging.exception()不要用 error ()❌ 设置了级别日志没有输出Logger 级别和 Handler 级别取更严格的那个。 例如 logger 级别 DEBUGhandler 级别 WARNING → 只能输出 WARNING 以上。❌ 使用 FileHandler 后控制台看不到输出需要额外添加 StreamHandler。不要混用根日志logging.info()和自定义 logger尽量统一使用logger实例。十一、basicConfig 和 LoggerHandler 怎么选小型脚本、简单测试用basicConfig()快速上手正式项目、多文件模块、需要同时屏幕 文件输出、日志切割必须用Logger Handler
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门