闲话不多说,继续优化 全局统一Restful API 响应框架 做到项目通用 接口可扩展。
如果没有看前面几篇文章请先看前面几篇
SpringBoot定义优雅全局统一Restful API 响应框架
SpringBoot定义优雅全局统一Restful API 响应框架二
SpringBoot定义优雅全局统一Restful API 响应框架三
SpringBoot定义优雅全局统一Restful API 响应框架四
这里解决上一篇留下问题 如何实现接口错误国际化。 还有上一篇错误提示也不是很友好
我们可以在进一步抽象出通用异常接口。
异常信息应由固定异常编码信息加上详细的错误自定义信息。
上一篇最后错误 提示依然不够友好具体。我们可以在具体到哪个字段

还有未知错误返回异常,这里之前提到要在·全局异常处理中接入自己的日志输出处理,我们只是单纯的打印在控制台。肯定是不行
如果项目中不做任何处理默认就会走Tomcat服务器日志处理逻辑,输出到 catalina 文件中 我们这里把这个问题处理一下。

公共错误异常类
自定义异常类继承运行时异常。自定义错误编码,和错误信息枚举
1/** 2* @author 公众号 程序员三时 3* @version 1.0 4* @date 2023/4/29 00:15 5* @webSite https://github.com/coder-amiao 6* 通用业务异常封装 7*/ 8@Data 9public class BusinessException extends RuntimeException { 10 /** 11 * 自定义异常编码 12 */ 13 private String code; 14 15 public BusinessException(String code, String message) { 16 super(message); 17 this.code = code; 18 } 19 20 public BusinessException(ResultCode resultCodeEnum) { 21 super(resultCodeEnum.getMessage()); 22 this.code = resultCodeEnum.getCode(); 23 } 24 25 public BusinessException(ResultCode resultCodeEnum, String msg) { 26 super(resultCodeEnum.getMessage() +" " +msg); 27 this.code = resultCodeEnum.getCode(); 28 } 29}
其他异常类也是如此
这里主要说一下如何把错误日志输出到指定服务器路径的指定log文件
日志文件按照类型和时间划分,一天一个按照指定大小
这样就方便自己查询错误日志

日志配置文件
logback-spring.xml springboot约定配置名称,可以读取加载属性文件
1<?xml version="1.0" encoding="UTF-8"?> 2<configuration scan="true" scanPeriod="60 seconds" debug="false"> 3 <contextName>shop-api</contextName> 4 <!--定义日志文件的存储地址 从springboot配置文件中获取路径--> 5 <springProperty scope="context" name="LOG_PATH" source="logging.file.path"/> 6 <!--springboot配置文件中获取日志级别--> 7 <springProperty scope="context" name="LOG_LEVEL" source="logging.level.root"/> 8 <!-- <property name="log.path" value="log" />--> 9 <property name="log.maxHistory" value="90" /> 10 <property name="log.colorPattern" value="%magenta(%d{yyyy-MM-dd HH:mm:ss}) %highlight(%-5level) %yellow(%thread) %green(%logger) %msg%n"/> 11 <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5level %thread %logger %msg%n"/> 12 13 <!--输出到控制台--> 14 <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> 15 <encoder> 16 <pattern>${log.colorPattern}</pattern> 17 </encoder> 18 </appender> 19 20 <!--输出到文件--> 21 <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender"> 22 <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> 23 <fileNamePattern>${LOG_PATH}/info/info.%d{yyyy-MM-dd}-%i.log</fileNamePattern> 24 <maxFileSize>3MB</maxFileSize> 25 <maxHistory>30</maxHistory> 26 <totalSizeCap>1GB</totalSizeCap> 27 </rollingPolicy> 28 <encoder> 29 <pattern>${log.pattern}</pattern> 30 </encoder> 31 <filter class="ch.qos.logback.classic.filter.LevelFilter"> 32 <level>INFO</level> 33 <onMatch>ACCEPT</onMatch> 34 <onMismatch>DENY</onMismatch> 35 </filter> 36 </appender> 37 38 <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender"> 39 <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> 40 <fileNamePattern>${LOG_PATH}/error/error.%d{yyyy-MM-dd}-%i.log</fileNamePattern> 41 <maxFileSize>3MB</maxFileSize> 42 <maxHistory>30</maxHistory> 43 <totalSizeCap>1GB</totalSizeCap> 44 </rollingPolicy> 45 <encoder> 46 <pattern>${log.pattern}</pattern> 47 </encoder> 48 <filter class="ch.qos.logback.classic.filter.LevelFilter"> 49 <level>ERROR</level> 50 <onMatch>ACCEPT</onMatch> 51 <onMismatch>DENY</onMismatch> 52 </filter> 53 </appender> 54 55 <root level="debug"> 56 <appender-ref ref="console" /> 57 </root> 58 59 <root level="info"> 60 <appender-ref ref="file_info" /> 61 <appender-ref ref="file_error" /> 62 </root> 63</configuration>
代理已经更新到 github仓库脚手架项目
关注公众号,程序员三时 持续输出优质内容 希望给你带来一点启发和帮助
