""" 日志集成示例 展示如何在现有控制器中集成日志功能 """ 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