一、参考
官方文档、链接,帮助文档:help(logging),源码
二、类
| 类 | 职责 | 关键方法/属性 |
|---|---|---|
Logger |
日志入口,接收日志请求,决定是否处理 | .debug(), .info(), .addHandler(), .setLevel() |
Handler |
决定日志输出到哪里(控制台/文件/网络等) | .emit(record), .setFormatter(), .setLevel() |
Formatter |
定义日志文本格式 | .format(record) |
Filter |
过滤特定日志(可选) | .filter(record) |
三、数据流向

从上图可以看出,Logger必须绑定Handler才能正常输出消息。
四、委托机制
委派给父级的意思是如果一个记录器的级别设置为 NOTSET(就是没有设置日志级别),将遍历其祖先记录器,直到找到级别不是 NOTSET 的记录器,或者到根记录器为止。然后根据该祖先记录器的级别,判断是否输出日志。
五、常用场景
5.1、直接设置root记录器
python
import logging
# basicConfig 本质就是配置 root logger
logging.basicConfig(
level=logging.WARNING,
format='%(name)s - %(levelname)s - %(message)s - %(asctime)s'
)
logging.warning("This will show")
5.2、单独设置记录器对象
python
import logging
# 1. 创建 Logger
logger = logging.getLogger('myapp')
logger.setLevel(logging.DEBUG)
# 2. 创建 Handler
console_handler = logging.StreamHandler()
file_handler = logging.FileHandler('app.log')
# 3. 设置 Handler 级别
console_handler.setLevel(logging.WARNING)
file_handler.setLevel(logging.DEBUG)
# 4. 创建 Formatter
simple_fmt = logging.Formatter('%(levelname)s - %(message)s')
detailed_fmt = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
# 5. 绑定 Formatter 到 Handler
console_handler.setFormatter(simple_fmt)
file_handler.setFormatter(detailed_fmt)
# 6. 将 Handler 添加到 Logger
logger.addHandler(console_handler)
logger.addHandler(file_handler)
# 7. 记录日志
logger.debug("Debug info") # 只写入文件
logger.warning("Warning!") # 控制台 + 文件
六、Formatter的格式记不住
点击进入Formatter源码,