python中logger包的详细使用教程(附实例代码)

 更新时间:2025年05月28日 08:26:33   作者:SunkingYang  
Python logging模块是标准库日志工具,支持多级别、多目标、多格式日志管理,这篇文章主要介绍了python中logger包详细使用的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

Python 的 logging 模块是标准库中用于记录日志的核心工具,通过灵活配置可实现多级别、多目标、多格式的日志管理。以下是其核心用法及详细说明:

功能说明

一、Logger 的创建与基础配置

  • 创建 Logger 实例使用 logging.getLogger(name) 创建或获取一个 Logger 对象。若未指定名称,默认返回根 Logger(root)。

    import logging
    logger = logging.getLogger('my_app')  # 创建名为 'my_app' 的 Logger
    
  • 设置日志级别Logger 的级别决定其处理的最低日志等级,可选级别从低到高为:DEBUGINFOWARNINGERRORCRITICAL

    logger.setLevel(logging.DEBUG)  # 记录 DEBUG 及以上级别的日志
    
  • 默认级别与继承关系

    • 若未显式设置级别,Logger 会继承父级(如 root)的级别,默认 WARNING
    • Logger 名称支持层级结构(如 a.b 继承 a 的配置),便于模块化日志管理。

二、Handler 的配置与使用

Handler 负责将日志发送到不同目标(如文件、控制台),可同时添加多个 Handler 实现多路输出。

常用 Handler 类型

Handler功能示例
StreamHandler输出到控制台(默认 sys.stderrlogging.StreamHandler()
FileHandler输出到文件logging.FileHandler('app.log', mode='a')
RotatingFileHandler日志文件按大小回滚(避免文件过大)from logging.handlers import RotatingFileHandler
TimedRotatingFileHandler按时间回滚日志文件(如每天生成新文件)from logging.handlers import TimedRotatingFileHandler

示例:同时输出到文件和控制台

# 文件 Handler(按大小回滚)
from logging.handlers import RotatingFileHandler
file_handler = RotatingFileHandler(
    'app.log', maxBytes=1024*1024, backupCount=5  # 单个文件最大1MB,保留5个备份
)
file_handler.setLevel(logging.INFO)

# 控制台 Handler
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)

# 添加 Handler 到 Logger
logger.addHandler(file_handler)
logger.addHandler(console_handler)

三、Formatter 自定义日志格式

通过 Formatter 可定义日志输出的格式,支持占位符如 %(asctime)s(时间)、%(levelname)s(级别)、%(message)s(消息)等。

formatter = logging.Formatter(
    '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S'  # 自定义时间格式
)
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)

四、记录不同级别的日志

通过 Logger 对象调用对应级别的方法记录日志:

logger.debug('调试信息,用于开发阶段追踪细节')    # 仅当 Logger 级别 ≤ DEBUG 时输出
logger.info('常规信息,如服务启动')              
logger.warning('潜在问题警告,如参数缺失')        
logger.error('程序错误,但应用仍可运行')          
logger.critical('严重错误,可能导致程序崩溃')     

五、高级配置与最佳实践

  • 全局配置快速启动使用 logging.basicConfig() 快速配置根 Logger,适合简单场景:

    logging.basicConfig(
        level=logging.INFO,
        format='%(asctime)s - %(message)s',
        handlers=[logging.FileHandler('app.log'), logging.StreamHandler()]
    )
    
  • 过滤器(Filter)通过 Filter 实现更精细的日志筛选,例如仅记录特定模块或包含关键字的日志:

    class CustomFilter(logging.Filter):
        def filter(self, record):
            return 'important' in record.getMessage()  # 仅记录含 'important' 的日志
    
    logger.addFilter(CustomFilter())
    
  • 避免重复日志若 Logger 层级配置不当,可能导致日志重复输出。建议在子 Logger 中禁用传播到父级:

    child_logger = logging.getLogger('my_app.sub_module')
    child_logger.propagate = False  # 阻止日志传递给父 Logger
    

六、常见问题与调试

  • 日志不显示:检查 Logger 和 Handler 的级别是否高于日志调用级别。
  • 多 Handler 冲突:确保每个 Handler 的级别和 Formatter 独立配置。
  • 性能优化:高频日志场景可使用 RotatingFileHandler 避免文件过大,或异步日志库(如 concurrent-log-handler)。

以下是 Python 中 logging 模块的详细使用教程,涵盖基础配置、高级用法及最佳实践,结合多篇权威资料整理而成:

使用方法

一、基础配置与快速使用

  • 引入模块与基础配置通过 basicConfig() 函数快速配置全局日志参数:

    import logging
    
    logging.basicConfig(
        level=logging.DEBUG,  # 设置最低日志级别为 DEBUG
        format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S',  # 时间格式
        filename='app.log',  # 输出到文件(默认追加模式)
        filemode='w'  # 覆盖模式写入文件(可选)
    )
    
  • 记录不同级别的日志使用预定义的日志级别方法输出信息:

    logging.debug('调试信息')    # 开发阶段追踪细节
    logging.info('常规状态')    # 程序正常运行信息
    logging.warning('潜在问题')  # 如参数缺失或兼容性问题
    logging.error('错误事件')    # 功能异常但程序仍运行
    logging.critical('严重故障') # 系统可能崩溃的致命错误
    

    注意:只有不低于 level 参数设置的级别才会被记录。

二、自定义 Logger 对象

  • 创建独立 Logger推荐为不同模块创建独立 Logger 以分类管理日志:

    logger = logging.getLogger('my_module')  # 名称建议使用模块名
    logger.setLevel(logging.INFO)  # 覆盖全局级别
    
  • 添加处理器(Handler)支持同时输出到控制台、文件、网络等多种目标:

    # 控制台处理器
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.DEBUG)
    
    # 文件处理器(按大小轮转)
    from logging.handlers import RotatingFileHandler
    file_handler = RotatingFileHandler(
        'app.log', maxBytes=10*1024*1024, backupCount=5  # 10MB/文件,保留5个备份
    )
    file_handler.setLevel(logging.ERROR)
    
    # 将处理器附加到 Logger
    logger.addHandler(console_handler)
    logger.addHandler(file_handler)
    
  • 自定义日志格式通过 Formatter 定义日志输出样式:

    formatter = logging.Formatter(
        '%(asctime)s [%(levelname)s] %(module)s:%(lineno)d - %(message)s',
        datefmt='%H:%M:%S'
    )
    console_handler.setFormatter(formatter)
    file_handler.setFormatter(formatter)
    

三、高级用法

  • 配置文件管理使用 .conf 或 .ini 文件分离配置(推荐大型项目):

    import logging.config
    
    logging.config.fileConfig('logging.conf')
    

    示例 logging.conf 内容

    [loggers]
    keys=root,my_app
    
    [handlers]
    keys=consoleHandler,fileHandler
    
    [formatters]
    keys=simpleFormatter
    
    [logger_root]
    level=DEBUG
    handlers=consoleHandler
    
    [logger_my_app]
    level=INFO
    handlers=fileHandler
    qualname=my_app
    propagate=0  # 禁止传播到父级 Logger
    
  • 日志传播控制通过 propagate 属性控制是否向父级 Logger 传递日志:

    child_logger = logging.getLogger('parent.child')
    child_logger.propagate = False  # 仅当前 Logger 处理日志
    
  • 过滤器(Filter)实现精细化日志筛选:

    class KeywordFilter(logging.Filter):
        def __init__(self, keyword):
            super().__init__()
            self.keyword = keyword
    
        def filter(self, record):
            return self.keyword in record.getMessage()
    
    logger.addFilter(KeywordFilter('重要'))
    

四、最佳实践与注意事项

  • 性能优化

    • 避免高频日志调用:使用 isEnabledFor() 检查级别后再记录:
      if logger.isEnabledFor(logging.DEBUG):
          logger.debug(f'耗时计算: {expensive_function()}')
      
    • 使用异步日志库(如 concurrent-log-handler)处理高并发场景。
  • 多环境配置根据运行环境动态调整配置:

    if os.getenv('ENV') == 'production':
        logger.setLevel(logging.WARNING)
    else:
        logger.setLevel(logging.DEBUG)
    
  • 错误处理为关键操作添加异常捕获并记录堆栈:

    try:
        risky_operation()
    except Exception as e:
        logger.exception('操作失败: %s', e)  # 自动记录堆栈跟踪
    

五、实际应用场景示例

网络请求监控

import requests

def fetch_data(url):
    try:
        response = requests.get(url, timeout=5)
        response.raise_for_status()
        logger.info(f'成功获取 {url} 数据')
        return response.json()
    except requests.RequestException as e:
        logger.error(f'请求失败: {url} - {str(e)}')
        return None

通过合理配置 Logger、Handler 和 Formatter,可以构建灵活高效的日志系统。更多高级功能(如远程日志、邮件通知)可参考 Python 官方文档

总结

到此这篇关于python中logger包详细使用的文章就介绍到这了,更多相关python logger包使用教程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • PyQt5使用mimeData实现拖拽事件教程示例解析上

    PyQt5使用mimeData实现拖拽事件教程示例解析上

    这篇文章主要为大家介绍了PyQt中如何使用mimeData实现拖拽事件的示例解析过程,有需要的朋友可以借鉴参考下希望能够有所帮助,祝大家多多进步
    2021-10-10
  • python 制作网站筛选工具(附源码)

    python 制作网站筛选工具(附源码)

    平常工作生活中,boos可能会给我们很多网站取提取信息,这些网站有的无法响应,有的404,有的501…真的需要所有网站都访问再提取信息吗?今天写一个小工具用于筛选网站中能访问的网站,在此仅举一例,即状态码为200。
    2021-01-01
  • python3操作注册表的方法(Url protocol)

    python3操作注册表的方法(Url protocol)

    使用python操作注册表的方法最近学习了一下,现在做一下笔记,由于对Python语言的使用还不是很熟练,所以写不出高大上的结构
    2020-02-02
  • 如何使用Python破解ZIP或RAR压缩文件密码

    如何使用Python破解ZIP或RAR压缩文件密码

    这篇文章主要介绍了如何使用Python破解ZIP或RAR压缩文件密码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • PyTorch平方根报错的处理方案

    PyTorch平方根报错的处理方案

    这篇文章主要介绍了PyTorch平方根报错的处理方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • python求列表对应元素的乘积和的实现

    python求列表对应元素的乘积和的实现

    这篇文章主要介绍了python求列表对应元素的乘积和的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • python 简单备份文件脚本v1.0的实例

    python 简单备份文件脚本v1.0的实例

    下面小编就为大家带来一篇python 简单备份文件脚本v1.0的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望对大家有所帮助
    2017-11-11
  • 使用Python脚本自动化管理Docker容器的完整指南

    使用Python脚本自动化管理Docker容器的完整指南

    在日常开发和运维中,我们经常需要对 Docker 容器进行批量操作,比如启动容器、重置 root 密码、删除无用容器等,手动执行命令效率低且容易出错,所以本文将使用Python脚本自动化管理Docker容器,需要的朋友可以参考下
    2026-01-01
  • 详解Python logging调用Logger.info方法的处理过程

    详解Python logging调用Logger.info方法的处理过程

    这篇文章主要介绍了详解Python logging调用Logger.info方法的处理过程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • Python2.x和3.x下maketrans与translate函数使用上的不同

    Python2.x和3.x下maketrans与translate函数使用上的不同

    这篇文章主要介绍了Python2.x和3.x下maketrans与translate函数使用上的不同,这两个函数建立映射来替换内容是Python学习当中的基础知识,需要的朋友可以参考下
    2015-04-04

最新评论