python 的 logging
模块是一个灵活且强大的日志记录工具,广泛应用于应用程序的调试、运行监控和问题排查。它提供了丰富的功能,包括多级日志记录、多种输出方式、灵活的格式配置等。以下是详细介绍:
一、为什么使用 logging 模块?
- 替代
print
:print
语句仅适合简单调试,而logging
支持持久化、级别控制、异步写入等。 - 分级日志:根据重要性区分日志(如 debug、info、error),便于过滤信息。
- 灵活输出:可同时输出到控制台、文件、网络等。
- 线程安全:适用于多线程/多进程环境。
二、核心组件
logger(记录器)
应用程序直接调用的接口,负责产生日志。
- 通过
logging.getlogger(name)
获取或创建 logger 实例。 - 支持层级结构(如
'parent.child'
继承父级配置)。
handler(处理器)
决定日志的输出位置(如控制台、文件、邮件等)。
- 常用 handler:
- streamhandler:输出到流(如控制台)。
- filehandler:输出到文件。
- rotatingfilehandler:按大小滚动日志文件。
- timedrotatingfilehandler:按时间滚动日志文件。
- smtphandler:发送邮件。
filter(过滤器)
提供更细粒度的日志过滤(如仅记录特定关键词的日志)。
formatter(格式器)
定义日志的输出格式(时间、级别、消息等)。
常用格式字段:
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'
三、日志级别
从低到高共 6 个级别(低于设定级别的日志将被忽略):
级别 | 数值 | 说明 |
---|---|---|
debug | 10 | 详细调试信息 |
info | 20 | 程序正常运行信息 |
warning | 30 | 潜在问题,但程序仍运行 |
error | 40 | 严重错误,影响部分功能 |
critical | 50 | 致命错误,可能导致程序终止 |
四、基本使用步骤
创建 logger
import logging logger = 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 logging logging.basicconfig( level=logging.info, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[ logging.filehandler('app.log'), logging.streamhandler() ] ) logging.warning('警告信息')
六、高级用法
配置文件或字典
使用 logging.config
模块通过文件或字典配置:
import logging.config config = { '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
,合理利用日志进行调试和监控。
到此这篇关于python logging模块使用示例详解的文章就介绍到这了,更多相关python logging模块使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论