Laravel 10中如何记录验证异常日志?
修改异常处理器记录请求验证异常到错误日志的方案
Java Spring Boot 场景
- 编写全局异常处理器,专门捕获请求参数验证相关的
MethodArgumentNotValidException和BindException - 示例代码:
@RestControllerAdvice public class GlobalExceptionHandler { private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); @ExceptionHandler(value = {MethodArgumentNotValidException.class, BindException.class}) public ResponseEntity<ErrorResponse> handleValidationExceptions(Exception ex) { BindingResult bindingResult = ex instanceof MethodArgumentNotValidException ? ((MethodArgumentNotValidException) ex).getBindingResult() : ((BindException) ex).getBindingResult(); StringBuilder errorMsg = new StringBuilder("请求验证失败: "); bindingResult.getAllErrors().forEach(error -> { errorMsg.append(error.getDefaultMessage()).append("; "); }); // 日志携带请求路径、具体错误和完整异常栈,方便定位问题 logger.error("请求验证异常 - 请求路径: {}, 错误信息: {}", ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getRequestURI(), errorMsg.toString(), ex); ErrorResponse response = new ErrorResponse(HttpStatus.BAD_REQUEST.value(), errorMsg.toString()); return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST); } }
- 核心要点:
- 用
@RestControllerAdvice标记全局处理器 - 日志必须包含请求路径和异常栈,否则排查时无法对应具体请求
- 调用
logger.error()时传入异常对象,自动记录栈信息
- 用
Python Flask 场景
- 注册全局错误处理器,捕获验证组件抛出的
ValidationError - 示例代码:
from flask import Flask, request import logging app = Flask(__name__) # 配置日志输出到指定文件 logging.basicConfig( filename='error.log', level=logging.ERROR, format='%(asctime)s - %(levelname)s - 请求路径: %(path)s - 错误信息: %(message)s' ) @app.errorhandler(ValidationError) def handle_validation_error(e): log_msg = f"请求验证失败: {str(e)}" # 传入请求路径,同时记录异常栈 app.logger.error(log_msg, extra={'path': request.path}, exc_info=True) return {"error": log_msg}, 400
- 核心要点:
- 通过
filename指定日志文件位置 exc_info=True自动写入异常栈到日志- 用
extra参数传递请求路径,让日志更具针对性
- 通过
Python Django 场景
- 自定义异常处理器,替换DRF默认处理器,专门处理
ValidationError - 示例代码(先创建项目根目录下的
exceptions.py):
import logging from django.http import JsonResponse from django.core.exceptions import ValidationError logger = logging.getLogger(__name__) def validation_exception_handler(exc, context): request_path = context['request'].path error_msg = f"请求验证失败: {str(exc)}" # 记录请求路径、错误信息和异常栈 logger.error("请求验证异常 - 请求路径: %s, 错误信息: %s", request_path, error_msg, exc_info=True) return JsonResponse({"error": error_msg}, status=400)
- 然后在
settings.py中配置:
REST_FRAMEWORK = { 'EXCEPTION_HANDLER': 'your_project_name.exceptions.validation_exception_handler' }
- 核心要点:
- 通过
context获取当前请求对象 - 日志必须包含请求路径,方便对应外部API的具体请求
- 确保
exc_info=True,保留完整异常栈用于排查
- 通过
内容的提问来源于stack exchange,提问作者BahaMagician
相关产品推荐
相关产品推荐

