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实现首页通知功能,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • Python递归时间复杂度

    Python递归时间复杂度

    这篇文章主要介绍了Python递归时间复杂度,时间复杂度一般认为O(logn),但递归算法的时间复杂度本质上是要看递归的次数,每次递归中的操作次数,下面文章详细介绍,需要的朋友可以参考一下
    2022-03-03
  • python-Web-flask-视图内容和模板知识点西宁街

    python-Web-flask-视图内容和模板知识点西宁街

    在本篇文章里小编给大家分享了关于python-Web-flask-视图内容和模板的相关知识点内容,有需要的朋友们参考学习下。
    2019-08-08
  • 关于使用python反编译apk签名出包的问题

    关于使用python反编译apk签名出包的问题

    这篇文章主要介绍了使用python反编译apk签名出包,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 使用python3.0 对接美团接口的实现示例

    使用python3.0 对接美团接口的实现示例

    本文主要介绍了python3.0 对接美团接口的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • Pytest运行方式及参数使用示例详解

    Pytest运行方式及参数使用示例详解

    这篇文章主要介绍了Pytest运行方式及参数使用详细教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • Python3 把一个列表按指定数目分成多个列表的方式

    Python3 把一个列表按指定数目分成多个列表的方式

    今天小编就为大家分享一篇Python3 把一个列表按指定数目分成多个列表的方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • Python实现将字典内容写入json文件

    Python实现将字典内容写入json文件

    这篇文章主要为大家详细介绍了如何利用Python语言实现将字典内容写入json文件,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-08-08
  • python pandas读取csv后,获取列标签的方法

    python pandas读取csv后,获取列标签的方法

    今天小编就为大家分享一篇python pandas读取csv后,获取列标签的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • python用opencv将标注提取画框到对应的图像中

    python用opencv将标注提取画框到对应的图像中

    这篇文章主要介绍了python用opencv将标注提取画框到对应的图像中,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08

最新评论