log_integration_example.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. """
  2. 日志集成示例
  3. 展示如何在现有控制器中集成日志功能
  4. """
  5. from flask import request, g
  6. from flask_restx import Resource, Namespace, fields
  7. from app.utils.logger import Logger, log_request_info, ErrorHandler
  8. from app.utils.error_handler import handle_authentication_error, handle_validation_error
  9. # 创建示例API命名空间
  10. api = Namespace('log_example', description='日志集成示例')
  11. # 定义API模型
  12. login_model = api.model('Login', {
  13. 'username': fields.String(required=True, description='用户名'),
  14. 'password': fields.String(required=True, description='密码')
  15. })
  16. @api.route('/login')
  17. class LoginResource(Resource):
  18. @api.expect(login_model, validate=True)
  19. @api.response(200, '登录成功')
  20. @api.response(401, '登录失败')
  21. @log_request_info # 自动记录请求信息
  22. def post(self):
  23. """用户登录 - 集成日志示例"""
  24. data = request.get_json()
  25. # 记录登录尝试
  26. Logger.info("用户登录尝试", {
  27. 'username': data.get('username'),
  28. 'ip_address': request.remote_addr,
  29. 'user_agent': request.headers.get('User-Agent')
  30. })
  31. try:
  32. # 模拟用户验证
  33. username = data.get('username')
  34. password = data.get('password')
  35. # 验证输入
  36. if not username or not password:
  37. Logger.warning("登录失败:缺少必要参数", {
  38. 'username': username,
  39. 'has_password': bool(password)
  40. })
  41. return handle_validation_error(
  42. ValueError("用户名和密码不能为空"),
  43. "username/password"
  44. )
  45. # 模拟用户验证逻辑
  46. if username == 'admin' and password == 'password':
  47. Logger.info("用户登录成功", {
  48. 'username': username,
  49. 'ip_address': request.remote_addr
  50. })
  51. return {
  52. 'message': '登录成功',
  53. 'user': {'username': username}
  54. }, 200
  55. else:
  56. Logger.warning("用户登录失败:凭据无效", {
  57. 'username': username,
  58. 'ip_address': request.remote_addr
  59. })
  60. return handle_authentication_error(
  61. ValueError("用户名或密码错误"),
  62. "invalid_credentials"
  63. )
  64. except Exception as e:
  65. Logger.error("登录过程中发生异常", e, {
  66. 'username': data.get('username'),
  67. 'ip_address': request.remote_addr
  68. })
  69. # 使用全局错误处理器
  70. ErrorHandler.handle_api_error(
  71. e,
  72. request.endpoint,
  73. {'username': data.get('username')}
  74. )
  75. raise
  76. @api.route('/protected')
  77. class ProtectedResource(Resource):
  78. @api.response(200, '访问成功')
  79. @api.response(401, '未授权')
  80. @log_request_info
  81. def get(self):
  82. """受保护的资源 - 展示访问日志"""
  83. # 记录受保护资源的访问
  84. Logger.access_log("访问受保护资源", {
  85. 'resource': 'protected',
  86. 'method': request.method,
  87. 'ip_address': request.remote_addr
  88. })
  89. Logger.info("受保护资源被访问", {
  90. 'endpoint': request.endpoint,
  91. 'ip_address': request.remote_addr
  92. })
  93. return {
  94. 'message': '这是受保护的资源',
  95. 'timestamp': Logger.get_logger().handlers[0].formatter.formatTime(
  96. Logger.get_logger().handlers[0].formatter.converter()
  97. )
  98. }, 200
  99. @api.route('/error-test')
  100. class ErrorTestResource(Resource):
  101. @api.response(500, '测试错误')
  102. @log_request_info
  103. def get(self):
  104. """错误测试端点 - 展示错误处理"""
  105. Logger.info("开始错误测试")
  106. try:
  107. # 模拟不同类型的错误
  108. error_type = request.args.get('type', 'general')
  109. if error_type == 'database':
  110. Logger.error("模拟数据库错误", None, {'error_type': 'database'})
  111. ErrorHandler.handle_database_error(
  112. ConnectionError("数据库连接失败"),
  113. "查询用户信息"
  114. )
  115. elif error_type == 'validation':
  116. Logger.error("模拟验证错误", None, {'error_type': 'validation'})
  117. return handle_validation_error(
  118. ValueError("数据验证失败"),
  119. "email"
  120. )
  121. elif error_type == 'auth':
  122. Logger.error("模拟认证错误", None, {'error_type': 'auth'})
  123. return handle_authentication_error(
  124. ValueError("Token无效"),
  125. "invalid_token"
  126. )
  127. else:
  128. # 模拟一般异常
  129. raise RuntimeError("这是一个测试异常")
  130. except Exception as e:
  131. Logger.error("错误测试中发生异常", e, {
  132. 'error_type': request.args.get('type', 'general'),
  133. 'test_endpoint': True
  134. })
  135. # 记录全局错误
  136. Logger.global_error("错误测试异常", e, {
  137. 'test_type': request.args.get('type', 'general')
  138. })
  139. raise