Python日志模块logging详解|日志格式、日志处理器(Handler)彻底吃透
一、为什么要用 logging 代替 print?
新手开发习惯用 print() 输出信息,但在正式项目中print 完全不适用:
print 无法区分 错误、警告、普通信息 等级
print 无时间、无代码行号,无法定位报错位置
print 只能打印控制台,无法保存到文件
无法灵活控制日志开关、过滤日志级别
logging 优势:分级输出、自定义格式、自动保存文件、可扩展多处理器,是 Python 项目日志标准方案。
二、logging 五大日志等级(由低到高)
logging 内置 5 种常用日志级别,级别越高越严重。默认只输出 WARNING 及以上 日志。
|
等级 |
数值 |
用途场景 |
|---|---|---|
|
DEBUG |
10 |
详细调试信息,开发阶段使用 |
|
INFO |
20 |
普通运行信息,记录程序正常流程 |
|
WARNING |
30 |
警告信息,程序不报错但存在风险 |
|
ERROR |
40 |
功能报错,单个逻辑失败 |
|
CRITICAL |
50 |
严重错误,程序无法继续运行 |
基础使用案例
import logging
logging.debug("这是DEBUG调试信息")
logging.info("这是INFO正常信息")
logging.warning("这是WARNING警告信息")
logging.error("这是ERROR错误信息")
logging.critical("这是CRITICAL严重错误")
默认仅输出 warning、error、critical,低级别日志会被过滤。
三、自定义日志格式(核心重点)
默认日志格式非常简陋,无法定位问题。我们可以通过 format 格式化字符串 自定义日志输出内容。
常用日志格式占位符
%(asctime)s:日志打印时间
%(levelname)s:日志级别名称
%(filename)s:当前执行文件名
%(lineno)d:代码行号
%(message)s:日志主体信息
标准企业级日志格式配置
import logging
# 配置日志基础设置
logging.basicConfig(
level=logging.DEBUG, # 设置最低输出级别
format="%(asctime)s | %(levelname)s | %(filename)s[line:%(lineno)d] | %(message)s",
datefmt="%Y-%m-%d %H:%M:%S"
)
# 测试输出
logging.debug("调试日志:参数加载完成")
logging.info("正常日志:程序启动成功")
logging.warning("警告日志:内存占用偏高")
logging.error("错误日志:接口请求失败")
配置后日志自带:时间 + 级别 + 文件名 + 行号 + 信息,排查问题极其方便。
四、日志处理器 Handler 详解
basicConfig 适合简单脚本,企业级项目必须使用 Logger + Handler 处理器。
Handler 作用:控制日志的输出去向。
两种最常用处理器:
-
StreamHandler:控制台输出处理器(打印到终端)
-
FileHandler:文件输出处理器(保存日志到本地文件)
4.1 日志组件四大核心角色
Logger(日志器):对外提供 debug/info/error 方法,程序入口
Handler(处理器):决定日志输出到哪里(控制台/文件)
Formatter(格式器):决定日志输出格式
Filter(过滤器):可选,过滤指定日志
五、实战案例
1:控制台处理器 StreamHandler
import logging
# 1. 创建日志器
logger = logging.getLogger("test_log")
logger.setLevel(logging.DEBUG) # 全局最低级别
# 2. 创建日志格式
formatter = logging.Formatter(
"%Y-%m-%d %H:%M:%S | %(levelname)s | %(filename)s:%(lineno)d | %(message)s"
)
# 3. 创建控制台处理器
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(formatter)
# 4. 处理器绑定到日志器
logger.addHandler(stream_handler)
# 测试
logger.info("控制台日志输出成功")
logger.error("模拟程序报错")
2:文件处理器 FileHandler(日志持久化)
将所有日志自动保存到本地 log 文件,用于后续排查线上问题。
import logging
# 1. 日志器
logger = logging.getLogger("file_log")
logger.setLevel(logging.DEBUG)
# 2. 格式器
formatter = logging.Formatter(
"%(asctime)s | %(levelname)s | %(message)s",
datefmt="%Y-%m-%d %H:%M:%S"
)
# 3. 文件处理器
file_handler = logging.FileHandler("run.log", encoding="utf-8")
file_handler.setFormatter(formatter)
# 4. 绑定
logger.addHandler(file_handler)
# 写入日志
logger.info("程序开始运行")
logger.warning("检测到非关键参数缺失")
logger.error("数据库连接超时")
运行后自动生成 run.log 文件,所有日志永久保存。
3:企业级终极方案:双处理器(控制台+文件同时输出)
开发时控制台看日志,运行时自动存文件,一套配置全覆盖!
import logging
# 1. 初始化日志器
logger = logging.getLogger("my_project_log")
logger.setLevel(logging.DEBUG)
# 防止重复打印
logger.handlers.clear()
# 2. 统一日志格式
formatter = logging.Formatter(
"%(asctime)s | %(levelname)-8s | %(filename)s[%(lineno)d] | %(message)s",
datefmt="%Y-%m-%d %H:%M:%S"
)
# 3. 控制台处理器
sh = logging.StreamHandler()
sh.setFormatter(formatter)
# 4. 文件处理器
fh = logging.FileHandler("app.log", encoding="utf-8")
fh.setFormatter(formatter)
# 5. 添加双处理器
logger.addHandler(sh)
logger.addHandler(fh)
# 测试
logger.debug("调试信息:参数初始化完成")
logger.info("项目启动成功")
logger.warning("请求频次较高")
logger.error("接口调用异常")
六、常见坑点总结
坑1:设置级别无效 → 忘记给 logger 设置 Level
坑2:日志重复打印 → 多次 addHandler,需 logger.handlers.clear()
坑3:日志文件乱码 → FileHandler 指定 encoding="utf-8"
坑4:debug 日志不输出 → 默认级别为 WARNING,需手动调低
七、全文总结
-
logging 是 Python 标准日志库,替代 print,适合所有正式项目;
-
五大日志等级:DEBUG < INFO < WARNING < ERROR < CRITICAL;
-
日志格式 Formatter 可以自定义时间、行号、文件、信息;
-
Handler 处理器决定日志输出位置:控制台 / 文件;
-
企业级标配:双处理器同时输出控制台+文件日志。
更多推荐
所有评论(0)