Python Logging库完全指南

 更新时间:2026年02月24日 10:14:49   作者:UrbanJazzerati  
本文主要介绍了Python Logging库完全指南,包括为什么使用Logging、快速开始、核心配置、进阶技巧和实用场景示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、为什么要使用Logging?

很多初学者喜欢用print()调试,但在实际项目中会遇到问题:

  • 项目跑起来后,不能随意中断程序查看输出
  • 需要区分不同重要程度的信息(错误、警告、普通信息)
  • 需要将日志保存到文件方便后续分析
  • 在生产环境中,需要动态调整日志详细程度

这就是Logging库存在的意义!

二、快速开始:5分钟上手

基础示例

import logging

# 最简单的使用方式
logging.basicConfig(level=logging.WARN)  # 设置日志级别

logging.debug('这是一条debug信息')      # 不会显示(默认级别更高)
logging.info('这是一条info信息')        # 不会显示
logging.warning('这是一条warning信息')  # 会显示√
logging.error('这是一条error信息')      # 会显示√
logging.critical('这是一条critical信息')# 会显示√

理解日志级别(从低到高)

  1. DEBUG - 调试细节,开发时使用
  2. INFO - 普通信息,确认事情按预期运行
  3. WARNING - 警告,发生了意外但不影响运行
  4. ERROR - 错误,部分功能受影响
  5. CRITICAL - 严重错误,程序可能崩溃

重要规则: 只会显示设置级别及以上的日志!

三、核心配置:让日志更实用

1. 配置日志格式和输出

# 详细配置示例
logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S',
    filename='app.log',  # 输出到文件
    filemode='a',         # 追加模式
    encoding='utf-8'     # 指定UTF-8编码,解决中文乱码问题
)


# 使用
logging.info("程序启动")
logging.warning("磁盘空间不足90%")
logging.error("数据库连接失败")

2. 常用格式化字段

%(name)s          Logger的名字
%(levelname)s     日志级别
%(message)s       日志内容
%(asctime)s       时间,可指定格式
%(filename)s      文件名
%(funcName)s      函数名
%(lineno)d        行号

四、进阶技巧:模块化使用

在实际项目中,我们通常不直接使用logging模块,而是创建自己的Logger:

1. 创建模块专用的Logger

# 在每个模块中这样做
import logging


# 创建logger实例,通常以模块名命名
logger = logging.getLogger(__name__)  # 这是最佳实践!


def process_data(data):
    logger.debug(f"开始处理数据,长度: {len(data)}")
    try:
        # 你的业务逻辑
        result = data * 2
        logger.info(f"数据处理成功,结果: {result}")
        return result
    except Exception as e:
        logger.error(f"数据处理失败: {str(e)}", exc_info=True)
        return None

2. 项目级别的配置

# config_logging.py - 日志配置文件
import logging
import logging.handlers
import os


def setup_logging():
    """配置项目日志系统"""
    
    # 创建formatter(定义日志格式)
    formatter = logging.Formatter(
        '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
    )
    
    # 创建logger
    logger = logging.getLogger()  # 根logger
    logger.setLevel(logging.DEBUG)  # 设置最低级别
    
    # 控制台处理器
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.INFO)  # 控制台只显示INFO及以上
    console_handler.setFormatter(formatter)
    
    # 文件处理器
    file_handler = logging.FileHandler('app.log')
    file_handler.setLevel(logging.DEBUG)  # 文件记录所有DEBUG及以上
    file_handler.setFormatter(formatter)
    
    # 按时间切分的文件处理器(推荐生产环境使用)
    time_handler = logging.handlers.TimedRotatingFileHandler(
        'app.log',
        when='midnight',  # 每天午夜切分
        interval=1,
        backupCount=7     # 保留7天
    )
    time_handler.setFormatter(formatter)
    
    # 添加处理器
    logger.addHandler(console_handler)
    logger.addHandler(file_handler)
    # logger.addHandler(time_handler)  # 使用这个替换上面的file_handler

五、实用场景示例

场景1:Web应用日志

import logging
from logging.handlers import RotatingFileHandler


# 创建logger
logger = logging.getLogger('webapp')
logger.setLevel(logging.INFO)


# 按大小滚动日志文件(最大10MB,保留5个备份)
handler = RotatingFileHandler(
    'webapp.log',
    maxBytes=10*1024*1024,  # 10MB
    backupCount=5
)


formatter = logging.Formatter(
    '%(asctime)s - %(clientip)s - %(user)s - %(message)s'
)
handler.setFormatter(formatter)
logger.addHandler(handler)


# 使用(假设在请求处理中)
def handle_request(request, user):
    # 添加额外信息
    extra = {'clientip': request.client_ip, 'user': user}
    logger.info('用户登录成功', extra=extra)

场景2:不同级别日志分开存储

import logging


# 配置不同的处理器
logger = logging.getLogger('myapp')


# 错误日志单独保存
error_handler = logging.FileHandler('errors.log')
error_handler.setLevel(logging.ERROR)


# 所有日志保存
all_handler = logging.FileHandler('all.log')
all_handler.setLevel(logging.DEBUG)


# 设置格式
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
error_handler.setFormatter(formatter)
all_handler.setFormatter(formatter)


logger.addHandler(error_handler)
logger.addHandler(all_handler)

六、最佳实践和小贴士

✅应该这样做:

  1. 尽早配置日志:在程序入口处配置,不要多处配置

  2. 使用getLogger(__name__) :自动获取模块名作为logger名

  3. 合理使用级别

    • DEBUG:调试信息
    • INFO:关键流程节点
    • WARNING:可预料的问题
    • ERROR:需要关注的错误
  4. 包含上下文信息:logger.error(f"用户{user_id}操作失败")

避免这样做:

  1. 不要在所有地方都用根logger
  2. 不要在日志中记录敏感信息(密码、密钥)
  3. 不要过度记录,避免日志过大

总结

Logging库看似复杂,但核心只有几个概念:

  1. Logger - 记录器(谁在记录)
  2. Handler - 处理器(记录到哪里)
  3. Formatter - 格式化器(怎么记录)
  4. Level - 级别(记录什么)

到此这篇关于Python Logging库完全指南的文章就介绍到这了,更多相关Python Logging库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Python实现模拟三体运动的示例代码

    基于Python实现模拟三体运动的示例代码

    此前所做的一切三体和太阳系的动画,都是基于牛顿力学的,而且直接对微分进行差分化,从而精度非常感人,用不了几年就得撞一起去。所以本文来用Python重新模拟一下三体运动,感兴趣的可以了解一下
    2023-03-03
  • python使用scapy模块实现ping扫描的过程详解

    python使用scapy模块实现ping扫描的过程详解

    这篇文章主要介绍了python使用scapy模块实现ping扫描的过程详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • 浅谈Python响应式类库RxPy

    浅谈Python响应式类库RxPy

    RxPy是非常流行的响应式框架Reactive X的Python版本,其实这些版本都是一样的,只不过是各个语言的实现不同而已。因此,如果学会了其中一种,那么使用其他的响应式版本也是轻而易举的
    2021-06-06
  • python使用tornado实现登录和登出

    python使用tornado实现登录和登出

    这篇文章主要为大家详细介绍了python使用tornado实现登录和登出,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • Python字典循环添加一键多值的用法实例

    Python字典循环添加一键多值的用法实例

    今天小编就为大家分享一篇Python字典循环添加一键多值的用法实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • Python中五种不同解析库的应用与提取速度对比

    Python中五种不同解析库的应用与提取速度对比

    这篇文章主要为大家详细介绍了Python中五种不同解析库的应用与提取速度对比,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-05-05
  • 使用Python实现为PDF文档设置和移除密码

    使用Python实现为PDF文档设置和移除密码

    在数字化时代,文档的安全性变得越来越重要,特别是对于包含敏感信息的PDF文件,所以本文主要来和大家介绍一下如何使用Python实现为PDF文档设置和移除密码,需要的可以参考下
    2024-03-03
  • Python如何使用bokeh包和geojson数据绘制地图

    Python如何使用bokeh包和geojson数据绘制地图

    这篇文章主要介绍了Python如何使用bokeh包和geojson数据绘制地图,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Python 写小游戏吃金币+打乒乓+滑雪(附源码)

    Python 写小游戏吃金币+打乒乓+滑雪(附源码)

    这篇文章主要给大家分享的是利用Python 写小游戏吃金币、打乒乓、滑雪并附上源码,具有一的知识性参考价值,需要的小伙伴可以参考一下
    2022-03-03
  • python re正则匹配网页中图片url地址的方法

    python re正则匹配网页中图片url地址的方法

    今天小编就为大家分享一篇python re正则匹配网页中图片url地址的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12

最新评论