You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 12:02:31