Springboot统一异常处理并保存到数据库

Posted 七彩的人生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Springboot统一异常处理并保存到数据库相关的知识,希望对你有一定的参考价值。

/**
     * 所有异常报错
     * @param
     * @return
     * @throws Exception
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Result allExceptionHandler(HttpServletRequest request,
                                      Exception ex) {
RequestWrapper requestWrapper = new RequestWrapper(request);
String body = requestWrapper.getBody();
log.info("【参数】" + body);
String path = request.getServletPath();
ErrorLogsUtil.error(ex,path,body);
log.error("Exception:"+ ex.getMessage());
return ResultUtils.error("操作失败");
 }

 

将异常 和 请求的路径,接口参数作为参数传递

目前这里的数据库连接是写死的

 package cn.com.connext.authority.utils;

import cn.com.connext.authority.config.DruidProperties;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class ErrorLogsUtil {
    /**
     * @param: [e]
     * @return  void
     * @Description  打印错误日志并保存到数据库
     */
    public static void error(Exception e,String path) {
        StackTraceElement stackTraceElement= e.getStackTrace()[0];
        Connection con = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/demo-boot?useSSL=false&characterEncoding=utf8", "root", "root");
        } catch (SQLException e1) {
            e1.printStackTrace();
        } catch (ClassNotFoundException e1) {
            e1.printStackTrace();
        }
        PreparedStatement ps = null;
        String sql = "INSERT INTO error_logs VALUES (UUID(), NOW(), ?,?,?)";
        try {
            ps = con.prepareStatement(sql);
            //打印日志,错在第几行
            String errorInfo = e.toString()+",errorMassage:"+stackTraceElement+","+"errorLine:"+stackTraceElement.getLineNumber();
            ps.setString(1, errorInfo);
            ps.setString(2,path);

ps.setString(3,params);
ps.execute(); } catch (SQLException e1) { e1.printStackTrace(); } finally { try { if(ps != null) { ps.close(); } if(con != null) { con.close(); } } catch (SQLException e1) { e1.printStackTrace(); } } } }

 

SQL

DROP TABLE IF EXISTS `error_logs`;

CREATE TABLE `error_logs` (
`id` varchar(36) NOT NULL,
`create_time` datetime DEFAULT NULL,
`msg` text,
`path` varchar(100) DEFAULT NULL,
`params` varchar(500) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

 

数据库配置用public static 会报错

 

以上是关于Springboot统一异常处理并保存到数据库的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot项目如何做到统一异常处理

SpringBoot-@ControllerAdvice 拦截异常并统一处理

springboot统一异常处理

SpringBoot进阶之统一异常处理(含源码)

springboot定义统一的返回异常提示数据格式

重学SpringBoot系列之统一全局异常处理