python中的logger包的详细使用教程

文章目录

  • 功能说明
      • 一、Logger 的创建与基础配置
      • 二、Handler 的配置与使用
      • 三、Formatter 自定义日志格式
      • 四、记录不同级别的日志
      • 五、高级配置与最佳实践
      • 六、常见问题与调试
  • 使用方法
      • 一、基础配置与快速使用
      • 二、自定义 Logger 对象
      • 三、高级用法
      • 四、最佳实践与注意事项
      • 五、实际应用场景示例

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


功能说明

一、Logger 的创建与基础配置

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

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

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

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

二、Handler 的配置与使用

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

常用 Handler 类型

Handler 功能 示例
StreamHandler 输出到控制台(默认 sys.stderr logging.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('严重错误,可能导致程序崩溃')     

五、高级配置与最佳实践

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

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

    class CustomFilter(logging.Filter):
        def filter(self, record):
            return 'important' in record.getMessage()  # 仅记录含 'important' 的日志
    
    logger.addFilter(CustomFilter())
    
  3. 避免重复日志
    若 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 模块的详细使用教程,涵盖基础配置、高级用法及最佳实践,结合多篇权威资料整理而成:


使用方法

一、基础配置与快速使用

  1. 引入模块与基础配置
    通过 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'  # 覆盖模式写入文件(可选)
    )
    
  2. 记录不同级别的日志
    使用预定义的日志级别方法输出信息:

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

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


二、自定义 Logger 对象

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

    logger = logging.getLogger('my_module')  # 名称建议使用模块名
    logger.setLevel(logging.INFO)  # 覆盖全局级别
    
  2. 添加处理器(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)
    
  3. 自定义日志格式
    通过 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)
    

三、高级用法

  1. 配置文件管理
    使用 .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
    
  2. 日志传播控制
    通过 propagate 属性控制是否向父级 Logger 传递日志:

    child_logger = logging.getLogger('parent.child')
    child_logger.propagate = False  # 仅当前 Logger 处理日志
    
  3. 过滤器(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('重要'))
    

四、最佳实践与注意事项

  1. 性能优化

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

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

    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如何通过自身日志系统读写日志文件


python中的logger包的详细使用教程_第1张图片

你可能感兴趣的:(#,python入门之日志使用,python,日志,logger,使用方法,说明)