Python logging 模块完整实战:自定义日志器、控制台 + 文件双输出

📅 2026/7/31 3:22:51
Python logging 模块完整实战:自定义日志器、控制台 + 文件双输出
前言在 Python 项目开发中print()只适合临时调试正式项目必须使用标准库logging。 logging 支持日志分级、格式化输出、同时打印控制台 写入本地文件、灵活过滤日志是工程开发必备工具。 本文结合代码实例拆解自定义 logger 完整配置流程理清日志器、处理器、格式器、日志级别四大核心概念。目录前言一、logging 基础核心概念1. 五大日志级别等级从小到大2. 四大组件3. 常用格式占位符二、完整可运行代码文中示例源码三、运行结果分析重点层级过滤规则本次代码实际输出四、两种配置方式对比方式 1basicConfig简易写法适合小型脚本方式 2自定义 Logger本文方案企业项目标准写法五、开发常见踩坑点六、拓展优化方向可自行扩展结语一、logging 基础核心概念1. 五大日志级别等级从小到大表格级别常量用途DEBUGlogging.DEBUG调试信息开发阶段使用INFOlogging.INFO常规运行信息记录正常流程WARNINGlogging.WARNING警告程序可继续运行ERRORlogging.ERROR错误部分功能执行失败CRITICALlogging.CRITICAL致命错误程序可能终止规则设置某个级别后只输出大于等于该级别的日志。2. 四大组件Logger日志器日志入口使用getLogger()创建推荐命名__name__避免 root 日志冲突Handler处理器决定日志输出到哪里StreamHandler输出到控制台FileHandler输出保存到本地文件Formatter格式器定义日志文本格式Filter过滤器可选自定义规则过滤日志3. 常用格式占位符plaintext%(name)s logger实例名称 %(levelname)s 日志级别英文名称 %(message)s 日志主体内容 %(asctime)s 时间戳 %(filename)s 文件名 %(lineno)d 行号二、完整可运行代码文中示例源码python运行import logging # 1. 创建日志器实例 logger logging.getLogger(__name__) # 设置日志器全局最低级别只是门槛处理器可以再次限制 logger.setLevel(logging.DEBUG) # 2. 控制台处理器输出到终端 stream_handler logging.StreamHandler() # 单独设置控制台输出级别 stream_handler.setLevel(logging.INFO) # 定义日志格式 stream_formatter logging.Formatter(%(name)s %(levelname)s %(message)s) stream_handler.setFormatter(stream_formatter) # 将处理器绑定到logger logger.addHandler(stream_handler) # 3. 文件处理器日志写入 log.txt file_handler logging.FileHandler(log.txt, encodingutf-8) # 文件日志单独设置级别 file_handler.setLevel(logging.WARNING) file_formatter logging.Formatter(%(name)s %(levelname)s %(message)s) file_handler.setFormatter(file_formatter) logger.addHandler(file_handler) # 测试输出日志 logger.debug(debug) logger.warning(warning) logger.error(error)三、运行结果分析重点层级过滤规则logger.setLevel(logging.DEBUG)日志器接收所有 ≥ DEBUG 的日志但不代表一定会打印最终输出受处理器控制。控制台处理器INFO级别 只会输出INFO、WARNING、ERROR、CRITICAL debug 日志不会打印在控制台文件处理器WARNING级别 只会输出WARNING、ERROR、CRITICAL debug、info 不会写入 log.txt本次代码实际输出控制台输出plaintext__main__ WARNING warning __main__ ERROR errorlog.txt 文件内容plaintext__main__ WARNING warning __main__ ERROR error关键知识点 Logger 级别 → 第一道过滤Handler 级别 → 第二道过滤。两道关卡都要满足日志才会最终输出。四、两种配置方式对比方式 1basicConfig简易写法适合小型脚本优点代码简短 缺点只能创建一个默认 root 日志器不支持多处理器差异化级别大型项目不推荐python运行import logging logging.basicConfig( levellogging.DEBUG, format%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s, handlers[ logging.StreamHandler(), logging.FileHandler(log.txt,encodingutf-8) ] )方式 2自定义 Logger本文方案企业项目标准写法✅ 支持控制台、文件设置不同日志级别✅ 可以创建多个独立日志器互不干扰 ✅ 格式灵活配置扩展性强 生产环境优先使用这种写法。五、开发常见踩坑点重复打印日志多次 addHandler避免函数反复执行添加处理器中文乱码FileHandler 务必指定encodingutf-8级别混淆很多新手误以为设置 logger 级别就万事大吉忘记 handler 也有独立级别不要直接使用logging.debug()会使用 root 日志器项目模块化推荐getLogger(__name__)六、拓展优化方向可自行扩展使用 RotatingFileHandler / TimedRotatingFileHandler实现日志分割防止单个日志文件过大封装日志工具类统一项目日志配置增加日志颜色美化控制台输出增加 Filter根据内容过滤日志结语logging 是 Python 开发必备基础能力区分日志器、处理器两级过滤逻辑是理解难点。 当你需要同时控制台看简洁日志、文件保存更重要的告警错误日志时本文这种多 Handler 方案就是最优选择。