头图

闲话不多说,继续优化 全局统一Restful API 响应框架 做到项目通用 接口可扩展。

如果没有看前面几篇文章请先看前面几篇

SpringBoot定义优雅全局统一Restful API 响应框架

SpringBoot定义优雅全局统一Restful API 响应框架二

SpringBoot定义优雅全局统一Restful API 响应框架三

SpringBoot定义优雅全局统一Restful API 响应框架四

这里解决上一篇留下问题 如何实现接口错误国际化。 还有上一篇错误提示也不是很友好

我们可以在进一步抽象出通用异常接口

异常信息应由固定异常编码信息加上详细的错误自定义信息。

上一篇最后错误 提示依然不够友好具体。我们可以在具体到哪个字段

还有未知错误返回异常,这里之前提到要在·全局异常处理中接入自己的日志输出处理,我们只是单纯的打印在控制台。肯定是不行

如果项目中不做任何处理默认就会走Tomcat服务器日志处理逻辑,输出到
catalina 文件中 我们这里把这个问题处理一下。

公共错误异常类

自定义异常类继承运行时异常。自定义错误编码,和错误信息枚举

/**
* @author 公众号 程序员三时
* @version 1.0
* @date 2023/4/29 00:15
* @webSite https://github.com/coder-amiao
* 通用业务异常封装
*/
@Data
public class BusinessException extends RuntimeException {
   /**
    * 自定义异常编码
    */
   private String code;

   public BusinessException(String code, String message) {
       super(message);
       this.code = code;
   }

   public BusinessException(ResultCode resultCodeEnum) {
       super(resultCodeEnum.getMessage());
       this.code = resultCodeEnum.getCode();
   }

   public BusinessException(ResultCode resultCodeEnum, String msg) {
       super(resultCodeEnum.getMessage() +" " +msg);
       this.code = resultCodeEnum.getCode();
   }
}

其他异常类也是如此

这里主要说一下如何把错误日志输出到指定服务器路径的指定log文件

日志文件按照类型和时间划分,一天一个按照指定大小

这样就方便自己查询错误日志

日志配置文件

logback-spring.xml springboot约定配置名称,可以读取加载属性文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <contextName>shop-api</contextName>
    <!--定义日志文件的存储地址 从springboot配置文件中获取路径-->
    <springProperty scope="context" name="LOG_PATH" source="logging.file.path"/>
    <!--springboot配置文件中获取日志级别-->
    <springProperty scope="context" name="LOG_LEVEL" source="logging.level.root"/>
    <!-- <property name="log.path" value="log" />-->
    <property name="log.maxHistory" value="90" />
    <property name="log.colorPattern" value="%magenta(%d{yyyy-MM-dd HH:mm:ss}) %highlight(%-5level) %yellow(%thread) %green(%logger) %msg%n"/>
    <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5level %thread %logger %msg%n"/>

    <!--输出到控制台-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${log.colorPattern}</pattern>
        </encoder>
    </appender>

    <!--输出到文件-->
    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/info/info.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <maxFileSize>3MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/error/error.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <maxFileSize>3MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <root level="debug">
        <appender-ref ref="console" />
    </root>

    <root level="info">
        <appender-ref ref="file_info" />
        <appender-ref ref="file_error" />
    </root>
</configuration>

代理已经更新到 github仓库脚手架项目

关注公众号,程序员三时 持续输出优质内容 希望给你带来一点启发和帮助


程序员三时
15 声望2 粉丝

speak less do more