Flask(十)日志与错误处理

在 Web 应用中,日志和错误处理至关重要:

  • 日志 帮助开发者调试、监控应用运行状态。
  • 错误处理 确保程序遇到异常时,能够优雅地处理并反馈给用户。

本章内容:

  1. Flask 日志系统
  2. 日志级别
  3. 日志文件存储
  4. 集成 logging 模块
  5. 日志轮转
  6. 自定义日志格式
  7. 错误处理
  8. 使用 Flask 内置的错误处理
  9. 自定义错误页面
  10. 日志与错误处理的最佳实践

10.1 Flask 内置日志系统

Flask 通过 app.logger 提供日志功能。默认情况下,app.logger 只会在 debug 模式 记录日志。

10.1.1 记录日志

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():

    app.logger.info("Index page accessed")

    return "Welcome to Flask Logging!"

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

启动后,访问 http://127.0.0.1:5000/,控制台会输出:

INFO:root:Index page accessed

10.2 日志级别

Flask 使用 Python logging 库,支持以下日志级别:

  • DEBUG:详细的调试信息
  • INFO:一般性信息
  • WARNING:警告(但不会影响程序运行)
  • ERROR:错误信息
  • CRITICAL:严重错误,可能导致程序终止

10.2.1 记录不同级别日志

@app.route('/log')
def log_example():

    app.logger.debug("This is a DEBUG message")

    app.logger.info("This is an INFO message")

    app.logger.warning("This is a WARNING message")

    app.logger.error("This is an ERROR message")

    app.logger.critical("This is a CRITICAL message")

    return "Check the console for log messages"

10.3 记录日志到文件

默认情况下,Flask 日志打印到控制台。我们可以将日志保存到文件。

10.3.1 配置日志文件

import logging

logging.basicConfig(
    filename="app.log",

    level=logging.INFO,

    format="%(asctime)s - %(levelname)s - %(message)s"
)

app.logger.addHandler(logging.FileHandler("app.log"))

app.logger.setLevel(logging.INFO)

访问 /log 后,app.log 文件中会记录:

2025-03-18 10:00:00 - INFO - This is an INFO message2025-03-18 10:00:00 - WARNING - This is a WARNING message2025-03-18 10:00:00 - ERROR - This is an ERROR message

10.4 日志轮转

长时间运行的应用会产生大量日志,占用存储空间。RotatingFileHandler 可以在日志文件达到一定大小后自动创建新文件。

10.4.1 配置日志轮转

from logging.handlers import RotatingFileHandler

handler = RotatingFileHandler(
    "app.log", maxBytes=10000, backupCount=3  # 最大10KB,最多存3个日志文件
)

handler.setLevel(logging.INFO)

app.logger.addHandler(handler)

10.5 自定义日志格式

日志格式可以自定义,便于分析:

formatter = logging.Formatter(
    "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)

handler.setFormatter(formatter)

日志示例:

2025-03-18 10:05:00 - myapp - INFO - This is a log message

10.6 Flask 内置错误处理

Flask 预定义了一些常见 HTTP 错误,如:

  • 404 Not Found
  • 403 Forbidden
  • 500 Internal Server Error

10.6.1 捕获 404 错误

@app.errorhandler(404)
def not_found(error):

    app.logger.warning("404 error occurred")

    return "Page not found!", 404

访问 /unknown,日志会记录:

2025-03-18 10:10:00 - WARNING - 404 error occurred

10.7 自定义错误页面

可以使用 Flask 模板系统,创建更友好的错误页面。

10.7.1 创建 templates/404.html

<!DOCTYPE html>
<html><head>
    <title>Page Not Found</title></head><body>

    <h1>Oops! 404 Error</h1>

    <p>The page you are looking for does not exist.</p></body>
</html>

10.7.2 修改 app.py

from flask import render_template

@app.errorhandler(404)
def not_found(error):

    return render_template("404.html"), 404

10.8 处理全局异常

可以使用 app.register_error_handler 捕获所有异常。

10.8.1 捕获所有异常

@app.errorhandler(Exception)
def handle_exception(e):

    app.logger.error(f"An error occurred: {str(e)}")

    return "An internal error occurred.", 500

访问 /error:

@app.route('/error')
def error():

    1 / 0  # 触发错误

日志记录:

2025-03-18 10:15:00 - ERROR - An error occurred: division by zero

10.9 结合 Sentry 进行异常监控

Sentry 是一个异常跟踪工具,可用于监控 Flask 应用。

10.9.1 安装 Sentry

pip install sentry-sdk

10.9.2 配置 Sentry

import sentry_sdk
from sentry_sdk.integrations.flask import FlaskIntegration

sentry_sdk.init(
    dsn="your-sentry-dsn",

    integrations=[FlaskIntegration()],

    traces_sample_rate=1.0
)

10.10 最佳实践

日志级别合理使用

  • DEBUG 只在开发环境使用
  • INFO 记录重要事件
  • WARNING 记录可预见问题
  • ERROR 记录程序错误
  • CRITICAL 记录严重错误

存储日志

  • 生产环境中使用日志文件
  • 结合日志轮转,防止占用过多存储

捕获所有异常

  • 使用 app.errorhandler(Exception) 统一处理异常

日志格式规范

  • 统一时间格式,方便分析

使用第三方监控

  • Sentry 等工具能实时捕获异常

10.11 结语

本章介绍了 Flask 的日志和错误处理,包括:

  • Flask 内置日志系统
  • 日志存储与轮转
  • Flask 错误处理
  • 自定义错误页面
  • 结合 Sentry 进行异常监控

在下一章,我们将探讨 Flask 的缓存与优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值