Python logging模块使用指南
Python 的 logging
模块是一个灵活且强大的日志记录工具,广泛应用于应用程序的调试、运行监控和问题排查。它提供了丰富的功能,包括多级日志记录、多种输出方式、灵活的格式配置等。以下是详细介绍:
一、为什么使用 logging
模块?
- 替代
print
:print
语句仅适合简单调试,而logging
支持持久化、级别控制、异步写入等。 - 分级日志:根据重要性区分日志(如 DEBUG、INFO、ERROR),便于过滤信息。
- 灵活输出:可同时输出到控制台、文件、网络等。
- 线程安全:适用于多线程/多进程环境。
二、核心组件
-
Logger(记录器)
应用程序直接调用的接口,负责产生日志。- 通过
logging.getLogger(name)
获取或创建 Logger 实例。 - 支持层级结构(如
'parent.child'
继承父级配置)。
- 通过
-
Handler(处理器)
决定日志的输出位置(如控制台、文件、邮件等)。- 常用 Handler:
StreamHandler
:输出到流(如控制台)。FileHandler
:输出到文件。RotatingFileHandler
:按大小滚动日志文件。TimedRotatingFileHandler
:按时间滚动日志文件。SMTPHandler
:发送邮件。
- 常用 Handler:
-
Filter(过滤器)
提供更细粒度的日志过滤(如仅记录特定关键词的日志)。 -
Formatter(格式器)
定义日志的输出格式(时间、级别、消息等)。- 常用格式字段:
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'
- 常用格式字段:
三、日志级别
从低到高共 6 个级别(低于设定级别的日志将被忽略):
级别 | 数值 | 说明 |
---|---|---|
DEBUG | 10 | 详细调试信息 |
INFO | 20 | 程序正常运行信息 |
WARNING | 30 | 潜在问题,但程序仍运行 |
ERROR | 40 | 严重错误,影响部分功能 |
CRITICAL | 50 | 致命错误,可能导致程序终止 |
四、基本使用步骤
-
创建 Logger
import logginglogger = logging.getLogger(__name__) # 推荐使用模块名作为Logger名称 logger.setLevel(logging.DEBUG) # 设置记录的最低级别
-
配置 Handler 和 Formatter
# 创建控制台 Handler console_handler = logging.StreamHandler() console_handler.setLevel(logging.WARNING) # 控制台只输出 WARNING 及以上级别# 创建文件 Handler file_handler = logging.FileHandler('app.log') file_handler.setLevel(logging.DEBUG) # 文件记录所有 DEBUG 及以上级别# 定义 Formatter formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') console_handler.setFormatter(formatter) file_handler.setFormatter(formatter)# 将 Handler 添加到 Logger logger.addHandler(console_handler) logger.addHandler(file_handler)
-
记录日志
logger.debug('Debug 信息') logger.info('程序启动') logger.warning('磁盘空间不足') logger.error('请求超时')
五、快速配置(basicConfig
)
适用于简单场景的快速配置:
import logginglogging.basicConfig(level=logging.INFO,format='%(asctime)s - %(levelname)s - %(message)s',handlers=[logging.FileHandler('app.log'),logging.StreamHandler()]
)logging.warning('警告信息')
六、高级用法
-
配置文件或字典
使用logging.config
模块通过文件或字典配置:import logging.configconfig = {'version': 1,'formatters': {'default': {'format': '%(asctime)s - %(levelname)s - %(message)s'}},'handlers': {'console': {'class': 'logging.StreamHandler','formatter': 'default','level': 'DEBUG'}},'root': {'handlers': ['console'],'level': 'INFO'} }logging.config.dictConfig(config)
-
捕获异常信息
使用logger.exception
记录异常堆栈:try:1 / 0 except Exception:logger.exception('发生异常:')
-
日志传播
子 Logger 默认将日志传递给父 Logger。可通过logger.propagate = False
关闭。
七、常见问题
-
重复日志
原因:多次添加 Handler 或basicConfig
被多次调用。
解决:确保 Handler 只添加一次,或在basicConfig
中设置force=True
。 -
性能优化
避免在高频代码中记录低级别日志(如 DEBUG),可预先检查级别:if logger.isEnabledFor(logging.DEBUG):logger.debug(f'耗时操作: {time_consuming()}')
八、总结
logging
模块通过灵活的配置和分级机制,满足了从简单到复杂的日志需求。掌握其核心组件(Logger、Handler、Formatter)和级别控制,能显著提升程序的可维护性。建议在项目中替代 print
,合理利用日志进行调试和监控。