Python记录日志的完整指南

 更新时间:2025年09月05日 09:17:57   作者:detayun  
在Python开发中,日志记录是监控程序运行、排查问题的核心手段,本文基于Python内置的logging模块,结合最佳实践,带你系统掌握日志记录的完整方法,需要的朋友可以参考下

一、为什么需要日志记录?

  • 问题定位:记录程序运行时状态,快速定位异常
  • 性能监控:跟踪关键业务指标(如API请求耗时)
  • 审计追踪:记录用户操作和系统变更
  • 调试辅助:比print()更灵活可控的调试方式

二、基础使用:5分钟快速上手

import logging

# 创建基础配置
logging.basicConfig(
    level=logging.INFO,  # 设置日志级别
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[
        logging.StreamHandler(),  # 输出到控制台
        logging.FileHandler('app.log')  # 输出到文件
    ]
)

# 创建记录器
logger = logging.getLogger('my_app')

# 记录不同级别的日志
logger.debug('调试信息')
logger.info('程序正常启动')
logger.warning('磁盘空间不足')
logger.error('数据库连接失败')
logger.critical('系统崩溃')

三、核心组件深度解析

日志级别(从低到高)

  • DEBUG:详细调试信息
  • INFO:常规操作记录
  • WARNING:潜在问题提醒
  • ERROR:运行时错误
  • CRITICAL:严重错误导致程序中止

五大核心组件

配置方式对比

配置方式适用场景优点
basicConfig()简单脚本/快速原型一行代码完成基础配置
代码配置中小型项目灵活可控
配置文件大型项目/团队协作分离配置与代码
字典配置动态配置/12因子应用兼容环境变量

四、高级用法与最佳实践

1. 日志轮转(避免日志文件过大)

from logging.handlers import RotatingFileHandler

# 每个文件10MB,保留3个备份
handler = RotatingFileHandler(
    'app.log', 
    maxBytes=10*1024*1024, 
    backupCount=3
)
logger.addHandler(handler)

2. 异步日志(提升性能)

from logging.handlers import QueueHandler, QueueListener
import queue
import threading

log_queue = queue.Queue(-1)
listener = QueueListener(log_queue, *logger.handlers)
listener.start()

logger.addHandler(QueueHandler(log_queue))

3. 上下文信息记录(如请求ID)

from logging import LoggerAdapter

class RequestContext:
    def __init__(self, request_id):
        self.request_id = request_id

adapter = LoggerAdapter(logger, {'request_id': 'REQ123'})
adapter.info('处理用户请求')
# 输出:[2025-09-04 10:00:00] - my_app - INFO - REQ123 - 处理用户请求

4. 敏感信息过滤

class SensitiveFilter:
    def filter(self, record):
        msg = record.msg
        # 替换敏感信息(如密码)
        msg = msg.replace('password=123456', 'password=******')
        record.msg = msg
        return True

logger.addFilter(SensitiveFilter())

五、常见问题解决方案

1. 日志重复记录问题

  • 原因:多次调用getLogger()导致重复添加Handler
  • 解决:使用__name__作为日志器名称,确保单例模式

2. 多线程日志安全

  • 问题:多线程下日志顺序错乱
  • 解决:使用logging内置线程锁(默认已处理),或改用异步日志

3. 日志文件权限问题

  • 问题:Linux下普通用户无法写入日志文件
  • 解决:创建专用日志目录并设置权限
mkdir /var/log/myapp
chmod 775 /var/log/myapp
chown -R appuser:appgroup /var/log/myapp

六、企业级日志架构建议

日志分级策略

  • DEBUG:本地开发环境
  • INFO:预生产环境
  • WARNING及以上:生产环境

集中化日志管理

  • 使用ELK(Elasticsearch+Logstash+Kibana)或Sentry
  • 配置日志采集代理(如Filebeat)

日志格式规范

  • 推荐JSON格式(便于解析)
  • 包含关键字段:时间戳、日志级别、类名、方法名、消息、线程ID

结语

掌握Python日志记录不仅是开发的基本功,更是构建可维护、可观测系统的基石。从简单的print()替换开始,逐步掌握格式化、处理器配置、日志轮转等高级技巧,最终构建符合企业级标准的日志系统。

最佳实践建议

  1. 始终使用logging模块代替print()
  2. 生产环境至少配置两个Handler(控制台+文件)
  3. 敏感信息必须脱敏处理
  4. 定期审查日志策略(建议每季度)

通过本文的系统讲解和代码示例,相信你已经具备设计专业日志系统的能力。立即在项目中实践这些技巧,让你的Python应用具备工业级的可观测性吧!

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

相关文章

  • Python的面向对象思想分析

    Python的面向对象思想分析

    这篇文章主要介绍了Python的面向对象思想分析,以实例形式较为详细的分析了封装,继承,多态的具体用法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • 利用Python实现刘谦春晚魔术

    利用Python实现刘谦春晚魔术

    刘谦在2024年春晚上的撕牌魔术的数学原理非常简单,可以用Python完美复现,文中通过代码示例给大家介绍的非常详细,感兴趣的同学可以自己动手尝试一下
    2024-02-02
  • Python 命名规范与最佳实践

    Python 命名规范与最佳实践

    本文介绍了Python命名规范与最佳实践,包括变量名、模块名、类名、函数名和常量名的命名规则,强调了命名的清晰性、一致性、科学性和避免使用特殊符号,感兴趣的朋友一起看看吧
    2025-03-03
  • python3 sqlite3限制条件查询的操作

    python3 sqlite3限制条件查询的操作

    这篇文章主要介绍了python3 sqlite3限制条件查询的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • pytorch torch.gather函数的使用

    pytorch torch.gather函数的使用

    torch.gather 是 PyTorch 中用于在指定维度上通过索引从源张量中提取元素的函数,它需要输入张量、维度索引和索引张量,示例代码展示了如何使用 torch.gather 从输入张量中按索引提取元素,返回的结果张量形状与索引张量相同
    2024-09-09
  • Python 代码性能优化技巧分享

    Python 代码性能优化技巧分享

    选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化来提高程序的执行效率
    2012-08-08
  • Python-OpenCV:cv2.imread(),cv2.imshow(),cv2.imwrite()的区别

    Python-OpenCV:cv2.imread(),cv2.imshow(),cv2.imwrite()的区别

    本文主要介绍了OpenCV cv2.imread(),cv2.imshow(),cv2.imwrite()的区别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • 详解利用Python scipy.signal.filtfilt() 实现信号滤波

    详解利用Python scipy.signal.filtfilt() 实现信号滤波

    这篇文章主要介绍了详解利用Python scipy.signal.filtfilt() 实现信号滤波,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-06-06
  • 解决更改AUTH_USER_MODEL后出现的问题

    解决更改AUTH_USER_MODEL后出现的问题

    这篇文章主要介绍了解决更改AUTH_USER_MODEL后出现的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • Pyecharts 中Geo函数常用参数的用法说明

    Pyecharts 中Geo函数常用参数的用法说明

    这篇文章主要介绍了Pyecharts 中Geo函数常用参数的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02

最新评论