Python3 logging 模块
用 print 调试很方便,但正式程序需要把运行信息按级别记录下来:哪些是细节、哪些是警告、哪些是错误,最好还带时间戳并写入文件。Python 标准库 logging 模块就是为此设计的,比 print 更规范、更可控、更易扩展。
五个日志级别
级别由低到高依次为 DEBUG、INFO、WARNING、ERROR、CRITICAL,越往上越严重:
| 级别 | 数值 | 用途 |
|---|---|---|
| DEBUG | 10 | 调试细节 |
| INFO | 20 | 常规信息,如服务启动 |
| WARNING | 30 | 潜在问题警告 |
| ERROR | 40 | 出错但程序还能继续 |
| CRITICAL | 50 | 严重错误,程序可能崩溃 |
basicConfig 快速上手
basicConfig 设置级别与格式,之后调用对应函数写日志;低于 level 的日志会被忽略:
import logging
logging.basicConfig(level=logging.INFO)
logging.debug('调试细节,默认不显示')
logging.info('服务已启动')
logging.warning('磁盘空间不足')
logging.error('数据库连接失败')
# 输出:
# INFO:root:服务已启动
# WARNING:root:磁盘空间不足
# ERROR:root:数据库连接失败
自定义 format 与 datefmt
默认格式没有时间,用 format 指定输出字段,datefmt 控制时间显示格式:
import logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s %(levelname)s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
logging.warning('内存占用过高')
# 输出:2025-01-06 10:30:45 WARNING 内存占用过高
format 常用字段
| 字段 | 含义 |
|---|---|
| %(asctime)s | 时间(配合 datefmt) |
| %(levelname)s | 级别名,如 INFO |
| %(name)s | logger 名称,默认 root |
| %(message)s | 日志正文 |
| %(lineno)d | 产生日志的代码行号 |
记录到文件
指定 filename 后日志写入文件而不是屏幕;每次运行默认追加到文件末尾:
import logging
logging.basicConfig(
level=logging.WARNING,
filename='app.log',
encoding='utf-8', # 需 Python 3.9+
format='%(asctime)s %(levelname)s %(message)s'
)
logging.warning('出现一次错误')
# 查看 app.log:2025-01-06 10:30:45 WARNING 出现一次错误
logger 对象与 handler
大型项目常用 logger 对象配合 handler:一个 logger 可挂多个 handler,把日志同时输出到控制台和文件,还能按模块取不同 logger:
import logging
logger = logging.getLogger('myapp') # 获取或创建 logger
logger.setLevel(logging.DEBUG)
fh = logging.FileHandler('app.log', encoding='utf-8') # 文件输出
logger.addHandler(fh) # 挂到 logger 上
logger.info('通过 logger 对象记录')
小结
logging 的使用套路:basicConfig 设置级别与格式,再用 logging.info/warning/error 记录;进阶则创建 logger 对象并挂多个 handler 分流输出。相比 print,它能分级、带时间、落文件,是正式程序的标准做法。