SpringBoot定義優雅全域性統一Restful API 響應框架五

2023-05-31 12:01:42

閒話不多說,繼續優化 全域性統一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倉庫腳手架專案

關注公眾號,程式設計師三時 持續輸出優質內容 希望給你帶來一點啟發和幫助