跳转到内容

Python 日志记录

来自代码酷
Admin留言 | 贡献2025年4月28日 (一) 21:10的版本 (Page creation by admin bot)

(差异) ←上一版本 | 已核准修订 (差异) | 最后版本 (差异) | 下一版本→ (差异)

Python日志记录[编辑 | 编辑源代码]

Python日志记录是软件开发中用于追踪程序运行时事件的重要机制。通过记录不同级别的信息(如调试信息、警告、错误等),开发者可以更高效地诊断问题、监控应用状态并分析用户行为。Python内置的logging模块提供了灵活的日志记录功能,适用于从简单脚本到大型应用程序的各种场景。

日志记录基础[编辑 | 编辑源代码]

为什么需要日志记录?[编辑 | 编辑源代码]

  • 调试: 记录程序执行流程,帮助定位错误。
  • 监控: 跟踪应用程序的运行状态和性能。
  • 审计: 记录用户操作或系统事件以满足合规要求。

日志级别[编辑 | 编辑源代码]

Python定义了5个标准日志级别(按严重性递增):

级别 数值 用途
DEBUG 10 详细调试信息
INFO 20 确认程序按预期运行
WARNING 30 潜在问题提示
ERROR 40 严重错误导致功能失效
CRITICAL 50 可能导致程序崩溃的严重错误

基本用法[编辑 | 编辑源代码]

简单示例[编辑 | 编辑源代码]

import logging

# 基础配置(输出到控制台)
logging.basicConfig(level=logging.INFO)

# 记录不同级别的日志
logging.debug("这条消息不会显示")  # 级别低于INFO
logging.info("程序启动")
logging.warning("磁盘空间不足80%")
logging.error("数据库连接失败")

输出:

INFO:root:程序启动
WARNING:root:磁盘空间不足80%
ERROR:root:数据库连接失败

日志格式定制[编辑 | 编辑源代码]

通过format参数自定义输出格式:

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S"
)

logging.info("格式化日志示例")

输出:

2023-11-15 14:30:00 - root - INFO - 格式化日志示例

高级配置[编辑 | 编辑源代码]

日志处理器(Handlers)[编辑 | 编辑源代码]

将日志输出到不同目标:

  • StreamHandler: 输出到控制台(默认)
  • FileHandler: 写入文件
  • SMTPHandler: 通过邮件发送错误日志
logger = logging.getLogger("my_app")
logger.setLevel(logging.DEBUG)

# 创建文件处理器
file_handler = logging.FileHandler("app.log")
file_handler.setLevel(logging.WARNING)

# 创建控制台处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)

# 添加处理器到logger
logger.addHandler(file_handler)
logger.addHandler(console_handler)

logger.info("这条信息会显示在控制台")
logger.warning("这条警告会同时出现在控制台和文件")

日志流程示意图[编辑 | 编辑源代码]

graph TD A[Logger] --> B[Filter?] B --> C[Handler] C --> D[Formatter] D --> E[输出目标]

实际应用案例[编辑 | 编辑源代码]

Web应用错误监控[编辑 | 编辑源代码]

记录Flask应用的错误和访问日志:

from flask import Flask
import logging
from logging.handlers import RotatingFileHandler

app = Flask(__name__)

# 配置滚动日志文件(最大1MB,保留3个备份)
handler = RotatingFileHandler('app.log', maxBytes=1024*1024, backupCount=3)
handler.setFormatter(logging.Formatter(
    '%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'
))
app.logger.addHandler(handler)

@app.route('/')
def index():
    app.logger.info('主页访问')
    return "Hello World"

if __name__ == '__main__':
    app.run(debug=True)

性能分析日志[编辑 | 编辑源代码]

记录函数执行时间:

import logging
import time

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("perf")

def time_it(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        duration = time.time() - start
        logger.info(f"{func.__name__} 执行耗时: {duration:.4f}秒")
        return result
    return wrapper

@time_it
def calculate_sum(n):
    return sum(range(n))

calculate_sum(10**6)

输出:

INFO:perf:calculate_sum 执行耗时: 0.0453秒

最佳实践[编辑 | 编辑源代码]

1. 避免root logger:为每个模块创建具名logger(logging.getLogger(__name__)) 2. 合理设置级别:生产环境通常使用INFO或WARNING级别 3. 敏感信息过滤:不要在日志中记录密码等敏感数据 4. 使用结构化日志:对于复杂系统,考虑JSON格式日志 5. 日志轮转:使用RotatingFileHandlerTimedRotatingFileHandler防止日志文件过大

数学表达式示例[编辑 | 编辑源代码]

当日志需要包含计算指标时,可以使用数学公式: 解析失败 (语法错误): {\displaystyle \log_{10} \left( \frac{\text{error\_count}}{\text{total\_requests}} \right) < \text{threshold} }

总结[编辑 | 编辑源代码]

Python的logging模块提供了强大而灵活的日志记录系统。通过合理配置日志级别、格式和处理器,开发者可以构建适合各种应用场景的日志解决方案。良好的日志实践能显著提高应用程序的可维护性和可调试性。