在 Web 应用中,日志和错误处理至关重要:
- 日志 帮助开发者调试、监控应用运行状态。
- 错误处理 确保程序遇到异常时,能够优雅地处理并反馈给用户。
本章内容:
- Flask 日志系统
- 日志级别
- 日志文件存储
- 集成 logging 模块
- 日志轮转
- 自定义日志格式
- 错误处理
- 使用 Flask 内置的错误处理
- 自定义错误页面
- 日志与错误处理的最佳实践
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 的缓存与优化。