Python logging模块使用指南

Python 的 logging 模块是一个灵活且强大的日志记录工具,广泛应用于应用程序的调试、运行监控和问题排查。它提供了丰富的功能,包括多级日志记录、多种输出方式、灵活的格式配置等。以下是详细介绍:


一、为什么使用 logging 模块?

  • 替代 printprint 语句仅适合简单调试,而 logging 支持持久化、级别控制、异步写入等。
  • 分级日志:根据重要性区分日志(如 DEBUG、INFO、ERROR),便于过滤信息。
  • 灵活输出:可同时输出到控制台、文件、网络等。
  • 线程安全:适用于多线程/多进程环境。

二、核心组件

  1. Logger (记录器)

    应用程序直接调用的接口,负责产生日志。

    • 通过 logging.getLogger(name) 获取或创建 Logger 实例。
    • 支持层级结构(如 'parent.child' 继承父级配置)。
  2. Handler (处理器)

    决定日志的输出位置(如控制台、文件、邮件等)。

    • 常用 Handler:
      • StreamHandler:输出到流(如控制台)。
      • FileHandler:输出到文件。
      • RotatingFileHandler:按大小滚动日志文件。
      • TimedRotatingFileHandler:按时间滚动日志文件。
      • SMTPHandler:发送邮件。
  3. Filter (过滤器)

    提供更细粒度的日志过滤(如仅记录特定关键词的日志)。

  4. Formatter (格式器)

    定义日志的输出格式(时间、级别、消息等)。

    • 常用格式字段:

      python 复制代码
      '%(asctime)s - %(name)s - %(levelname)s - %(message)s'

三、日志级别

从低到高共 6 个级别(低于设定级别的日志将被忽略):

级别 数值 说明
DEBUG 10 详细调试信息
INFO 20 程序正常运行信息
WARNING 30 潜在问题,但程序仍运行
ERROR 40 严重错误,影响部分功能
CRITICAL 50 致命错误,可能导致程序终止

四、基本使用步骤

  1. 创建 Logger

    python 复制代码
    import logging
    
    logger = logging.getLogger(__name__)  # 推荐使用模块名作为Logger名称
    logger.setLevel(logging.DEBUG)        # 设置记录的最低级别
  2. 配置 Handler 和 Formatter

    python 复制代码
    # 创建控制台 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)
  3. 记录日志

    python 复制代码
    logger.debug('Debug 信息')
    logger.info('程序启动')
    logger.warning('磁盘空间不足')
    logger.error('请求超时')

五、快速配置(basicConfig

适用于简单场景的快速配置:

python 复制代码
import logging

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler('app.log'),
        logging.StreamHandler()
    ]
)

logging.warning('警告信息')

六、高级用法

  1. 配置文件或字典

    使用 logging.config 模块通过文件或字典配置:

    python 复制代码
    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)
  2. 捕获异常信息

    使用 logger.exception 记录异常堆栈:

    python 复制代码
    try:
        1 / 0
    except Exception:
        logger.exception('发生异常:')
  3. 日志传播

    子 Logger 默认将日志传递给父 Logger。可通过 logger.propagate = False 关闭。


七、常见问题

  1. 重复日志

    原因:多次添加 Handler 或 basicConfig 被多次调用。

    解决:确保 Handler 只添加一次,或在 basicConfig 中设置 force=True

  2. 性能优化

    避免在高频代码中记录低级别日志(如 DEBUG),可预先检查级别:

    python 复制代码
    if logger.isEnabledFor(logging.DEBUG):
        logger.debug(f'耗时操作: {time_consuming()}')

八、总结

logging 模块通过灵活的配置和分级机制,满足了从简单到复杂的日志需求。掌握其核心组件(Logger、Handler、Formatter)和级别控制,能显著提升程序的可维护性。建议在项目中替代 print,合理利用日志进行调试和监控。

相关推荐
vvoennvv11 小时前
【Python TensorFlow】 TCN-GRU时间序列卷积门控循环神经网络时序预测算法(附代码)
python·rnn·神经网络·机器学习·gru·tensorflow·tcn
自学互联网11 小时前
使用Python构建钢铁行业生产监控系统:从理论到实践
开发语言·python
无心水11 小时前
【Python实战进阶】7、Python条件与循环实战详解:从基础语法到高级技巧
android·java·python·python列表推导式·python条件语句·python循环语句·python实战案例
xwill*12 小时前
RDT-1B: A DIFFUSION FOUNDATION MODEL FOR BIMANUAL MANIPULATION
人工智能·pytorch·python·深度学习
陈奕昆12 小时前
n8n实战营Day2课时2:Loop+Merge节点进阶·Excel批量校验实操
人工智能·python·excel·n8n
程序猿追12 小时前
PyTorch算子模板库技术解读:无缝衔接PyTorch模型与Ascend硬件的桥梁
人工智能·pytorch·python·深度学习·机器学习
秋邱12 小时前
高等教育 AI 智能体的 “导学诊践” 闭环
开发语言·网络·数据库·人工智能·python·docker
组合缺一12 小时前
Solon AI 开发学习6 - chat - 两种 http 流式输入输出
python·学习·http
沐浴露z12 小时前
为什么使用SpringAI时通常用Builder来创建对象?详解 【Builder模式】和【直接 new】的区别
java·python·建造者模式
青瓷程序设计13 小时前
【宠物识别系统】Python+TensorFlow+Vue3+Django+人工智能+深度学习+卷积神经网络算法
人工智能·python·深度学习