Python3 logging 模块

用 print 调试很方便,但正式程序需要把运行信息按级别记录下来:哪些是细节、哪些是警告、哪些是错误,最好还带时间戳并写入文件。Python 标准库 logging 模块就是为此设计的,比 print 更规范、更可控、更易扩展。

五个日志级别

级别由低到高依次为 DEBUG、INFO、WARNING、ERROR、CRITICAL,越往上越严重:

级别数值用途
DEBUG10调试细节
INFO20常规信息,如服务启动
WARNING30潜在问题警告
ERROR40出错但程序还能继续
CRITICAL50严重错误,程序可能崩溃

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)slogger 名称,默认 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,它能分级、带时间、落文件,是正式程序的标准做法。

笔记加载中…