当前位置: 首页 > news >正文

SpringBoot 全局异常处理与日志记录——统一规范实战

线上系统出问题不可怕,可怕的是出了问题找不到原因。统一的异常处理和规范的日志记录是任何生产系统必备的基础设施。

一、全局异常处理

1. 自定义业务异常

publicclassBusinessExceptionextendsRuntimeException{privateintcode;privateStringmessage;publicBusinessException(intcode,Stringmessage){super(message);this.code=code;this.message=message;}// 常用错误码publicstaticBusinessExceptionnotFound(Stringmsg){returnnewBusinessException(404,msg);}publicstaticBusinessExceptionbadRequest(Stringmsg){returnnewBusinessException(400,msg);}publicstaticBusinessExceptionunauthorized(Stringmsg){returnnewBusinessException(401,msg);}publicstaticBusinessExceptionforbidden(Stringmsg){returnnewBusinessException(403,msg);}}

2. 全局异常处理器

@RestControllerAdvicepublicclassGlobalExceptionHandler{privatestaticfinalLoggerlog=LoggerFactory.getLogger(GlobalExceptionHandler.class);@ExceptionHandler(BusinessException.class)publicResultVO<?>handleBusiness(BusinessExceptione){log.warn("业务异常: code={}, msg={}",e.getCode(),e.getMessage());returnResultVO.error(e.getCode(),e.getMessage());}@ExceptionHandler(MethodArgumentNotValidException.class)publicResultVO<?>handleValidation(MethodArgumentNotValidExceptione){Stringmsg=e.getBindingResult().getFieldErrors().stream().map(FieldError::getDefaultMessage).collect(Collectors.joining(";"));returnResultVO.error(400,msg);}@ExceptionHandler(ConstraintViolationException.class)publicResultVO<?>handleConstraint(ConstraintViolationExceptione){Stringmsg=e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining(";"));returnResultVO.error(400,msg);}@ExceptionHandler(NoHandlerFoundException.class)publicResultVO<?>handle404(NoHandlerFoundExceptione){returnResultVO.error(404,"接口不存在: "+e.getRequestURL());}@ExceptionHandler(Exception.class)publicResultVO<?>handleOther(Exceptione){log.error("系统异常",e);returnResultVO.error(500,"服务器繁忙,请稍后重试");}}

二、统一日志记录

1. 请求日志拦截器

@ComponentpublicclassLogInterceptorimplementsHandlerInterceptor{privatestaticfinalLoggerlog=LoggerFactory.getLogger(LogInterceptor.class);@OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler){// 记录请求开始时间request.setAttribute("startTime",System.currentTimeMillis());returntrue;}@OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex){longstart=(long)request.getAttribute("startTime");longduration=System.currentTimeMillis()-start;log.info("[{}] {} {} → {} ({}ms)",request.getMethod(),request.getRequestURI(),request.getQueryString()!=null?"?"+request.getQueryString():"",response.getStatus(),duration);}}

2. 注册拦截器

@ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{@AutowiredprivateLogInterceptorlogInterceptor;@OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry.addInterceptor(logInterceptor).addPathPatterns("/api/**");}}

3. 日志级别配置

logging:level:root:INFOcom.zhang:DEBUGcom.zhang.seckill.mapper:TRACEfile:path:/var/log/appname:${logging.file.path}/app.loglogback:rolling policy:max-history:30max-file-size:100MB

三、日志最佳实践

// ✅ 正确:带参数占位符log.info("用户 {} 创建订单 {}",userId,orderNo);// ❌ 错误:字符串拼接log.info("用户 "+userId+" 创建订单 "+orderNo);// ✅ 正确:包含上下文信息log.warn("支付失败: orderNo={}, amount={}, error={}",orderNo,amount,error);// ❌ 错误:没信息量的日志log.info("支付失败");

💡 觉得有用的话,点赞 + 关注【张老师技术栈】吧!每周更新 Java/Python/爬虫 实战干货,不让你白来。

http://www.jsqmd.com/news/1141897/

相关文章:

  • 2026最新8款团队编程协作平替工具权威实测合集
  • 如何快速掌握BS-RoFormer:音乐分离深度学习模型实战问题解决方案指南
  • 基于TPAFE0808与PIC24的多通道信号采集系统设计
  • 华硕笔记本性能控制终极指南:G-Helper轻量级工具完整教程
  • Python 多重比较 5 种校正方法实战:Bonferroni vs FDR vs Holm vs Sidak vs Tukey
  • IQ-TREE:终极系统发育分析工具的革命性突破
  • PyTorch Adam 优化器 weight_decay 参数详解:从 1e-4 到 1e-6 的 3 个调优场景
  • 2026年PDF转PPT,完整实操指南:各类转换方法与免费工具全梳理
  • IntelliJ IDEA 中 JRebel 扩展插件 激活
  • ChatGPT写完还不够:发布前我一定会检查这7项
  • 论绝对真理的不可让渡性与西方学术产业的结构性腐败​​​​​​​——对形式系统僭越、证伪主义迷思及当代“论文制造业“的系统性批判
  • 从零开始搭建个人游戏串流服务器:Sunshine全攻略
  • 5分钟找回QQ空间青春记忆:GetQzonehistory终极数据备份指南
  • milvus | 第 4 章:Milvus 启动流程与组件生命周期
  • okbiye 科研绘图新解法!文字输入一键产出全学科规范学术图表
  • 基于171010550与MK20DN128VFM5的DC-DC降压方案设计
  • 爬虫请求性能优化——连接池复用、缓存策略、并发控制
  • ImageGlass图片浏览器终极指南:免费开源支持90+格式的高效工具
  • ICM-42688-P与MK64FX512VDC12在机器人控制与工业监测中的应用
  • Calibre路径翻译插件NoTrans:彻底解决中文路径乱码问题的终极指南
  • 纽扣电池增强器NBM5100A:提升低功耗设备电源性能
  • 2026年论文党必备:盘点2026年备受追捧的的降AIGC工具
  • 免费文档下载神器kill-doc:一键解决所有文档网站限制的终极工具
  • 20年专注单伸位货叉加工,品质更可靠
  • Claude 新模型发布后,通过 API 接口平台如何第一时间跟上
  • ICM-42688-P与MK20DN128VFM5在工业运动感知中的高效协同
  • MiniMax Hub一站式AI开发平台:Claude Code配置与自动化管线实战
  • 通过协议实现业务逻辑(业务路由分发和rpc)
  • 零基础1小时打造原创IP视频(白嫖邪修版本)
  • Java计算机毕设之基于前后端分离的宠物寄养机构服务平台的设计与实现 基于 SpringBoot 的宠物寄养状态跟踪系统(完整前后端代码+说明文档+LW,调试定制等)