| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- """
- 日志集成示例
- 展示如何在现有控制器中集成日志功能
- """
- from flask import request, g
- from flask_restx import Resource, Namespace, fields
- from app.utils.logger import Logger, log_request_info, ErrorHandler
- from app.utils.error_handler import handle_authentication_error, handle_validation_error
- # 创建示例API命名空间
- api = Namespace('log_example', description='日志集成示例')
- # 定义API模型
- login_model = api.model('Login', {
- 'username': fields.String(required=True, description='用户名'),
- 'password': fields.String(required=True, description='密码')
- })
- @api.route('/login')
- class LoginResource(Resource):
- @api.expect(login_model, validate=True)
- @api.response(200, '登录成功')
- @api.response(401, '登录失败')
- @log_request_info # 自动记录请求信息
- def post(self):
- """用户登录 - 集成日志示例"""
- data = request.get_json()
-
- # 记录登录尝试
- Logger.info("用户登录尝试", {
- 'username': data.get('username'),
- 'ip_address': request.remote_addr,
- 'user_agent': request.headers.get('User-Agent')
- })
-
- try:
- # 模拟用户验证
- username = data.get('username')
- password = data.get('password')
-
- # 验证输入
- if not username or not password:
- Logger.warning("登录失败:缺少必要参数", {
- 'username': username,
- 'has_password': bool(password)
- })
- return handle_validation_error(
- ValueError("用户名和密码不能为空"),
- "username/password"
- )
-
- # 模拟用户验证逻辑
- if username == 'admin' and password == 'password':
- Logger.info("用户登录成功", {
- 'username': username,
- 'ip_address': request.remote_addr
- })
-
- return {
- 'message': '登录成功',
- 'user': {'username': username}
- }, 200
- else:
- Logger.warning("用户登录失败:凭据无效", {
- 'username': username,
- 'ip_address': request.remote_addr
- })
-
- return handle_authentication_error(
- ValueError("用户名或密码错误"),
- "invalid_credentials"
- )
-
- except Exception as e:
- Logger.error("登录过程中发生异常", e, {
- 'username': data.get('username'),
- 'ip_address': request.remote_addr
- })
-
- # 使用全局错误处理器
- ErrorHandler.handle_api_error(
- e,
- request.endpoint,
- {'username': data.get('username')}
- )
-
- raise
- @api.route('/protected')
- class ProtectedResource(Resource):
- @api.response(200, '访问成功')
- @api.response(401, '未授权')
- @log_request_info
- def get(self):
- """受保护的资源 - 展示访问日志"""
- # 记录受保护资源的访问
- Logger.access_log("访问受保护资源", {
- 'resource': 'protected',
- 'method': request.method,
- 'ip_address': request.remote_addr
- })
-
- Logger.info("受保护资源被访问", {
- 'endpoint': request.endpoint,
- 'ip_address': request.remote_addr
- })
-
- return {
- 'message': '这是受保护的资源',
- 'timestamp': Logger.get_logger().handlers[0].formatter.formatTime(
- Logger.get_logger().handlers[0].formatter.converter()
- )
- }, 200
- @api.route('/error-test')
- class ErrorTestResource(Resource):
- @api.response(500, '测试错误')
- @log_request_info
- def get(self):
- """错误测试端点 - 展示错误处理"""
- Logger.info("开始错误测试")
-
- try:
- # 模拟不同类型的错误
- error_type = request.args.get('type', 'general')
-
- if error_type == 'database':
- Logger.error("模拟数据库错误", None, {'error_type': 'database'})
- ErrorHandler.handle_database_error(
- ConnectionError("数据库连接失败"),
- "查询用户信息"
- )
- elif error_type == 'validation':
- Logger.error("模拟验证错误", None, {'error_type': 'validation'})
- return handle_validation_error(
- ValueError("数据验证失败"),
- "email"
- )
- elif error_type == 'auth':
- Logger.error("模拟认证错误", None, {'error_type': 'auth'})
- return handle_authentication_error(
- ValueError("Token无效"),
- "invalid_token"
- )
- else:
- # 模拟一般异常
- raise RuntimeError("这是一个测试异常")
-
- except Exception as e:
- Logger.error("错误测试中发生异常", e, {
- 'error_type': request.args.get('type', 'general'),
- 'test_endpoint': True
- })
-
- # 记录全局错误
- Logger.global_error("错误测试异常", e, {
- 'test_type': request.args.get('type', 'general')
- })
-
- raise
|