Spring boot 入门教程-全局异常处理及日志输出

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27828675/article/details/80844393

全局异常处理这里主要用到 @ControllerAdvice

1.自定义异常处理类

import lombok.Data;

/**
 * @Description: 自定义异常
 */
@Data
public class CommonException extends RuntimeException {

    public CommonException(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    private int code;
    private String msg;


}

注意:这里省略了setter/getter,使用了lombok 插件@Data注解,这里不再赘述。

2.全局异常处理类

@Slf4j
@RestControllerAdvice
public class CommonExceptionHandler {
    /**
     * 全局异常捕捉处理
     * @param ex
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    public Map errorHandler(HttpServletRequest req,Exception ex) {
        Map map = new HashMap();
        map.put("code", 100);
        map.put("message", ex.getMessage());
        map.put("url", req.getRequestURL());
        map.put("params", req.getParameterMap());
        log.error("发生未处理的异常={}",ex.getMessage(),ex);
        return map;
    }

    /**
     * 拦截捕捉自定义异常 MyException.class
     * @param ex
     * @return
     */
    @ExceptionHandler(value = CommonException.class)
    public Map myErrorHandler(HttpServletRequest req, CommonException ex) {
        Map map = new HashMap();
        map.put("code", ex.getCode());
        map.put("message", ex.getMsg());
        map.put("url", req.getRequestURL());
        map.put("params", req.getParameterMap());
        return map;
    }
}

3.controller

 @RequestMapping(value = "/login",method = RequestMethod.POST)
    public UserBase  login(@RequestParam String account) {

        UserBase result = null;
        try {
            result = userBaseService.userLogin(account);
        } catch (Exception e) {
            log.error("用户登录异常={}",e.getMessage(),e);
            throw new CommonException(500,"内部错误");
        }
        return result ;
    }
4.测试 

请求:get方式:http://localhost:18080/userBase/login?account=111111

返回:{
    "code": 100,
    "message": "Request method 'GET' not supported",
    "params": {
        "account": [
            "111111"
        ]
    },
    "url": "http://localhost:18080/userBase/login"

}

表明是全局异常捕获:errorHandler方法执行.

关掉数据库,制造异常采用 post 请求

返回:{
    "code": 500,
    "message": "内部异常",
    "params": {
        "account": [
            "18612908620"
        ]
    },
    "url": "http://localhost:18080/userBase/login"
}

表明自定义异常捕获成功!

附:logback.xml 异常按级别输出到文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 修改一下路径-->
    <property name="PATH" value="logs"></property>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <Pattern>[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] --%mdc{client}%msg%n</Pattern>
        </encoder>
    </appender>

    <!--<appender name="TRACE_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${PATH}/trace.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>logs/trace.%d{yyyy-MM-dd}.log</FileNamePattern>
        </rollingPolicy>
        <layout>
            <pattern>[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern>
        </layout>
    </appender>-->

    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${PATH}/info.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>logs/info.%d{yyyy-MM-dd}.log</FileNamePattern>
        </rollingPolicy>
        <layout>
            <pattern>[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern>
        </layout>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${PATH}/debug.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>logs/debug.%d{yyyy-MM-dd}.log</FileNamePattern>
        </rollingPolicy>
        <layout>
            <pattern>[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern>
        </layout>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>


    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${PATH}/warn.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>logs/warn.%d{yyyy-MM-dd}.log</FileNamePattern>
        </rollingPolicy>
        <layout>
            <pattern>[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern>
        </layout>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>



    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${PATH}/error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>logs/error.%d{yyyy-MM-dd}.log</FileNamePattern>
        </rollingPolicy>
        <layout>
            <pattern>[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern>
        </layout>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <root level="TRACE">
        <appender-ref ref="INFO_FILE" />
        <appender-ref ref="DEBUG_FILE" />
        <appender-ref ref="WARN_FILE" />
        <appender-ref ref="ERROR_FILE" />
    </root>
    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>



猜你喜欢

转载自blog.csdn.net/qq_27828675/article/details/80844393