SpringBoot(六):统一异常入库处理

SpringBoot统一数据返回格式 & 统一异常处理 统一数据返回格式 & 统一异常处理 阅读详情

Spring Boot系列
SpringBoot(一):Quick start
SpringBoot(二):多环境切换
SpringBoot(三):Respond封装
SpringBoot(四):统一异常处理
SpringBoot(五):自定义属性获取

目录

一.简介
二.创建数据库表
三.创建ErrorUtil工具类
四.请求测试
五.建议

一.简介

项目上线后,对于项目报错后,我们只能通过查看服务器的日志,但是对于日志量大的文件,我们看起来多少会有些乏力,我们有没有一种方式一目了然的就可以知道错误在什么地方,然后直接定位到代码层面上呢?
基于上述的问题,我司弄了一套这样子的方案
1.基于Spring Boot的统一异常处理,抓取全局异常(实现请看SpringBoot(四):统一异常处理)
2.数据库建立错误日志表
3.在捕获到异常后,将错误详细信息写入数据库中
4.每日统计错误日志类型(可以分模块写入,详情看表设计)

二.创建数据库表

2.1 表设计

关注点:模块日志,时间,错误日志信息,所以生成以下该表结构

CREATE TABLE `itc_error_logs` (
  `id` varchar(36) NOT NULL COMMENT 'id',
  `log_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '日志生成时间',
  `log_info` text NOT NULL COMMENT '日志信息',
  `type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '类型,默认0 (0:用户管理;1:消费记录;2:运营调度;3:算法;4:测试)',
  PRIMARY KEY (`id`),
  KEY `log_time` (`log_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='错误日志表'
三.创建ErrorLogsUtil工具类

工程目录
这里写图片描述

3.1添加mysql 驱动

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.35</version>
        </dependency>

3.2 获取mysql配置信息

修改配置文件application-dev.properties,详情看 SpringBoot(五):自定义属性获取

server.port=8080

#测试属性值
yjgithub.name=cyj
yjgithub.email=yigithub@163.com
yjgithub.sex=man

#mysql

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://172.16.1.159:3306/bus_cloud?characterEncoding=utf8&useSSL=false
spring.datasource.username=bus
spring.datasource.password=bus123456

MysqlConfig.java

package com.citydata.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * @Author chenyj
 * @Date 2018/05/29
 * @Description  MySql配置文件信息
 */
@Component
public class MySqlConfig {

    // 驱动类
    public static String driver;
    @Value("${spring.datasource.driver-class-name}")
    public void setDriver(String $driver) {
        this.driver = $driver;
    }

    // url地址
    public static String url;
    @Value("${spring.datasource.url}")
    public void setUrl(String $url) {
        this.url = $url;
    }

    // 用户名
    public static String username;
    @Value("${spring.datasource.username}")
    public void setUsername(String $username) {
        this.username = $username;
    }

    // 密码
    public static String password;
    @Value("${spring.datasource.password}")
    public void setPassword(String $password) {
        this.password = $password;
    }


}

3.3 编写ErrorLogsUtil.java类
路径

/com/citydata/util/ErrorLogsUtil.java

ErrorLogsUtil.java

package com.citydata.util;


import com.citydata.config.MySqlConfig;

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

/**
 * @Author yjgithub
 * @Date 14:29 2018/05/29
 * @Description  错误日志工具
 */
public class ErrorLogsUtil {

    /**
     * @Author  yjgithub
     * @param: [e]
     * @return  void
     * @Date 10:33 2018/5/29
     * @Description  打印错误日志并保存到数据库
     */
    public static void error(Exception e) {
        StackTraceElement stackTraceElement= e.getStackTrace()[0];
        Connection con = null;
        try {
            Class.forName(MySqlConfig.driver);
            con = (Connection) DriverManager.getConnection(MySqlConfig.url, MySqlConfig.username, MySqlConfig.password);
        } catch (SQLException e1) {
            e1.printStackTrace();
        } catch (ClassNotFoundException e1) {
            e1.printStackTrace();
        }
        PreparedStatement ps = null;
        String sql = "INSERT INTO itc_error_logs VALUES (UUID(), NOW(), ?, ?)";
        try {
            ps = con.prepareStatement(sql);
            //打印日志,错在第几行
            String errorInfo = e.toString()+",errorMassage:"+stackTraceElement+","+"errorLine:"+stackTraceElement.getLineNumber();
            ps.setString(1, errorInfo);
            ps.setInt(2, 4); //错误类型为4
            ps.execute();
        } catch (SQLException e1) {
            e1.printStackTrace();
        } finally {
            try {
                if(ps != null) {
                    ps.close();
                }
                if(con != null) {
                    con.close();
                }
            } catch (SQLException e1) {
                e1.printStackTrace();
            }

        }
    }
}

3.4 写入数据库
在统一异常处理中,利用该工具类进行记录错误日志
修改为:

    //数组越界异常
    @ExceptionHandler(ArrayIndexOutOfBoundsException.class)
    public ReturnData ArrayIndexOutOfBoundsException(ArrayIndexOutOfBoundsException ex) {
        AppConstant.log.info("数组越界异常",ex);
        ErrorLogsUtil.error(ex); //这里注意,这里注意,调用工具类写入数据库
        return resultFormat(ERROR_CODE, new Exception(ArrayIndexOutOfBoundsStr));
    }
四.请求测试

在 SpringBoot(四):统一异常处理 该文章中出现一个数据越界异常,用这个请求来测试
这里写图片描述

测试数据越界成功
查看数据库变化
利用sql查询

SELECT * FROM itc_error_logs i WHERE i.`type` = 4;

这里写图片描述

文本内容

java.lang.ArrayIndexOutOfBoundsException: 4,errorMassage:com.citydata.service.impl.TestImpl.exception(TestImpl.java:25),errorLine:25

根据错误提示错误类和行数修改即可
这里写图片描述

测试到此结束

五.建议

1.查询sql根据自行需求编写

SELECT * FROM itc_error_logs i WHERE i.`type` = 4;
SELECT * FROM itc_error_logs i WHERE i.`log_time` > '2018-05-29 00:00:00' AND i.`type` = '4'

2.如果你们公司的前端够闲的话,还可以做个前端页面展示,这样就不用连数据库查看,直接在前端展示,更为直观

PS:需要项目源代码,请邮件yjgithub@163.com联系

SpringBoot统一返回和统一异常处理 在 SpringBoot 项目中,统一返回和统一异常处理是非常常用的一环,它们能提高应用的可读性和可维护性,统一返回有助于保持代码一致性和规范性,在前后端联调时更加方便,统一异常处理,减少了代码冗余,对异常处理更加易于管理。 阅读详情

相关推荐

将赛灵思 SDK 工程移植到 Vitis 的分步指南

注:本文转自赛灵思中文社区论坛,源文链接在此。本文原作者为XILINX工程师。 以下为个人译文,仅供参考,如有疏漏之处,还请不吝赐教。 您是赛灵思软件开发套件 (SDK) 用户吗? 您是否正在计划将自己的工程移植到 Vitis 软件平台? 那么本篇工程移植分步指南将能祝您一臂之力。 从 2019.2 版开始,赛灵思 SDK 开发环境已统一整合到全功能一体化的 Vitis™ 统一软件平台中。 尊敬的 SDK 用户,您只需轻点几下鼠标即可体验这一功能丰富的工具! 马上开始将工程从赛灵思 S

weixin_45825101的博客 1731

异常信息记录入库

全局异常异步记录到数据库

Alexon Xu的博客 1587

基于Flink的风控系统

可以使用Flink-Stream进行实时数据流的检测和处理,或者使用Flink-Kafka集群进行数据转发和存储,然后使用Flink-Table进行数据表的查询和分析。在Flink中,可以使用Flink-Stream进行数据流的处理,或者使用Flink-Kafka进行Kafka数据流的消费和处理。Flink的运行时本身也支持迭代算法的执行。可以使用Flink-Stream进行实时数据流的检测和处理,或者使用Flink-Kafka集群进行数据转发和存储,然后使用Flink-Table进行数据表的查询和分析。

m0_68231587的博客 1875

JAVA获取异常保存到库

e.printStackTrace(); final Writer result = new StringWriter(); final PrintWriter printWriter = new PrintWriter(result); e.fillInStackTrace().printStackTr...

qq_37240849的博客 539

Remote ID的调制解调FPGA实现

Remote ID源于航空安全需求,例如在无人机密集区域实现设备跟踪和防碰撞。它类似于航空领域的ADS-B系统,但针对低空飞行器。Remote ID系统通常工作在特定频段(如2.4 GHz或5.8 GHz),通过无线链路广播数据包,包含设备ID、经纬度、高度和速度等信息。调制解调过程确保这些数据在噪声环境中可靠传输。例如,标准如ASTM F3411定义了Remote ID的协议框架,其中调制解调是关键物理层组件。

yulongfenghu的博客 1506

WorkBuddy 集成 飞书CLI,全程10分钟,丝滑无比,老板要注意了...

飞书CLI实测:10分钟实现AI操控飞书办公 飞书CLI作为命令行工具,让用户通过简单命令完成飞书各项操作。本文记录了从安装到使用的完整过程:一键安装仅需10分钟,支持200多条命令覆盖飞书全部功能,与AI结合后可实现自然语言办公。实测中成功用语音指令创建了7天发文计划日程,验证了其便捷性。虽然首次认证存在超时问题,但整体体验流畅。该工具将复杂操作简化为自然语言指令,大幅提升办公效率,特别适合需要频繁使用飞书的用户。后续还将探索更多自动化办公场景。

三棱球的专栏 1143

java 捕获异常并存入数据库_java 将捕获的异常添加到数据库

将捕获的异常添加到数据库 未必是什么好事,但是我还是这么做了异常实体类public class TException {private String eid;private String eResource;private Date eCreated;private byte[] eMsg;}mapper是逆向工具生成的,不展示了service实现层@Service("tExceptionServ...

weixin_35822534的博客 1749

解决Jupyter Notebook中Plotly图表显示问题

摘要:在Jupyter Notebook中使用Plotly绘图时遇到图表无法显示的问题。通过分析发现Python 3.12版本与Jupyter存在兼容性问题。解决方案是将Python降级到3.11版本,重新创建虚拟环境后图表正常显示。这表明版本兼容性对数据可视化工具至关重要,环境配置检查是解决问题的关键步骤。该案例为遇到类似问题的开发者提供了参考方案。

m0_74337424的博客 125

【JavaSE】异常 (异常抛出 异常的捕获 异常声明throws try-catch捕获并处理 finally 自定义异常)

super();super(s);} }super();super(s);} }自定义异常if(!System . out . println("用户名错误!");throw new UserNameException("你的用户名错了");} if(!System . out . println("密码错误!");throw new PassWordException("你的密码错了");try {System . out . println("用户名异常!");

m0_68800221的博客 1422

uniapp(微信小程序) - 实现uniapp小程序电子签名板,横屏手写姓名签名专用写字画板,客户专用签字板,手写签名签字画板组件,手写签名,(详细运行示例,一键复制开箱即用)

uniapp实现微信小程序的电子签名效果,uniapp微信小程序 电子签名 写字板,用uniapp实现微信小程序的电子签名,uniapp微信小程序canvans实现手写签名,记录一个uniapp写的小程序的手写板,横屏,用于签名,unniapp实现电子签名,uniapp怎么做横屏的手写签名,uniapp如何实现签字板,uniapp小程序平台下怎么做电子签名板组件,uniapp电子签名插件,uniapp最好用的电子写字板插件组件源码,实现uniapp 手写签名功能,手写板、签字板,uni-app插件市场最好的

✅ 精选推荐文章 1万+

Python航空航天设计神器!从入门到实操,小白也能搞定飞机优化

AeroSandbox的核心价值的是:​降低航空工程优化的门槛,用Python实现高效、简洁的工程设计​。无论是科研、学习还是实际项目,它都能帮你节省大量时间,不用再手动推导导数、编写复杂的优化逻辑。对于新手来说,建议先从案例1(Rosenbrock函数)入手,熟悉优化流程,再尝试案例2(翼型优化),逐步掌握核心用法;对于有航空相关需求的小伙伴,可以深入研究内置的物理模型,结合自己的项目进行定制化开发。最后,互动时间到!👉 你是用AeroSandbox做科研、练手还是实际项目?

源代码杀手的博客 124

Java将异常入库_Exception异常库

什么是异常?定义:异常是程序在执行过程中,发生不正常的情况。在java中,异常是一种描述出错信息的对象。异常是程序在执行过程中所产生的问题。java.lang.ArithmeticException算术异常,执行非法的算术表达式时抛出,比如:除0异常。(int x =9\0)java.lang.ArrayIndexOutOfBoundsException数组下标越界异常,在访问数组元素,下标为负数...

weixin_42423817的博客 679

uniapp APP端:蓝牙报错writeBLECharacteristicValue:fail property not support(uni.writeBLECharacteristicVal)

uni-app 蓝牙fail property not support、发现不了服务特征值的问题、突然发现微信蓝牙小秘密,使用uni-app编译成安卓APP后报错writeBLECharacteristicValue:fail property not support,发现不了服务特征值,uniApp APP调用蓝牙API发送指令过快导致,uniapp 蓝牙 writeBLECharacteristicValue property_not_support iOS Android BLE GATT 特征值写入

✅ 精选推荐文章 2943

Springboot项目全局异常统一处理

最近在做项目时需要对异常进行全局统一处理,主要是一些分类入库以及记录日志等,因为项目是基于Springboot的,所以去网络上找了一些博客文档,然后再结合项目本身的一些特殊需求做了些许改造,现在记录下来便于以后查看。 在网络上找到关于Springboot全局异常统一处理的文档博客主要是两种方案: 1、基于@ControllerAdvice注解的Controller层的全局异常统一处理 以下是...

hao_kkkkk的专栏 11万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

SpringBoot之统一异常处理

详解SpringBoot统一异常处理,并结合源码剖析为什么有多个符合的异常处理方法时能匹配到最合适的异常处理方法,以及统一异常处理的优点。

. 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Springboot使用@Valid注解,对其参数错误异常的统一处理

在我们使用springboot作为微服务框架进行敏捷开发的时候,为了保证传递数据的安全性,需要对传递的数据进行校验,但是在以往的开发中,开发人员花费大量的时间在繁琐的if else 等判断语句来对参数进行校验,这种方式不但降低了我们的开发速度,而且写出来的代码中带有很多冗余代码,使得编写的代码不够优雅,为了将参数的验证逻辑和代码的业务逻辑进行解耦,Java给我们提供了@Valid注解...

qq_38796327的博客 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【SpringBoot3】统一数据响应,全局异常处理以及通用响应处理

在Spring Boot中设计一个优秀的异常处理机制,可以确保应用程序在遇到错误时提供清晰、一致的响应,同时提高系统的健壮性和可维护性。1)定义自定义异常类;2)创建全局异常处理器;3)定义统一的异常响应格式;4)异常分层;5)日志记录;7)提供友好的用户错误信息;8)处理全局异常

不积跬步无以至千里,不积小流无以成江海。一个喜欢学习分享的程序员 6050

springboot整合之统一异常处理

springboot整合实战 springboot整合之统一异常处理

qq_35771266的博客 6159

SpringBoot统一异常处理详解

Spring Boot后端接口规范Spring在3.2版本增加了一个注解,可以与、、等注解注解配套使用。不过跟异常处理相关的只有注解,从字面上看,就是异常处理器的意思**Assert(断言)**是Spring 家族的,在我们写测试用例的时候经常会用到,使用断言能让我们编码的时候有一种非一般丝滑的感觉Assert的部分源码,可以看到,Assert 其实就是帮我们把 if {…} 封装了一下,抛出的异常是} } }

Shawn的个人博客 1万+

SpringBoot统一结果返回,统一异常处理,大牛都这么玩

当实现统一结果返回时,需要创建一个通用的响应对象,定义成功和失败的返回情况,并确保在接口中使用这个通用返回对象。@Setter@Getter/*** 接口响应状态码*//*** 接口响应信息*//*** 接口响应的数据*/统一结果返回的关键之一是规定一套通用的状态码。这有助于客户端更容易地理解和处理 API 的响应,同时也为开发者提供了一致的标准。200 OK:表示成功处理请求。:表示成功创建资源。:表示成功处理请求,但没有返回任何内容。:客户端请求错误。:未授权访问。

攻城狮不是猫 2955

SpringBoot统一功能处理——统一异常处理

统一异常处理使用的是 @ControllerAdvice + @ExceptionHandler 来实现的,@ControllerAdvice 表示控制器通知类, @ExceptionHandler 是异常处理器,两个结合表示当出现异常的时候执行某个通知,也就是执行某个方法事件。

m0_60462557的博客 2807

springBoot统一异常处理并入库

统一异常处理并错误信息入库 1,我们先建一个统一返回给前端的类Result 包含 success code message entity import com.cmp.business.common.enums.ResultCodeEnum; /** * 返回对象 * * @param <T> * @author yusheng * @Description TOD...

qq_35429332的博客 836

10.SpringBoot的统一异常处理详解

异常处理是程序在运行过程中遇到错误时的处理机制。在Web应用中,异常处理负责捕获和处理各种异常情况,并向客户端返回友好的错误信息。形象比喻: 想象异常处理就像医院的急诊科:Spring提供了多种异常处理方式:SpringBoot默认提供了基本的异常处理机制: 当访问这些端点时,SpringBoot会返回默认的错误信息,但这些信息对用户不够友好。可以通过配置文件定制默认错误页面: 3. 全局异常处理器 3.1 基础全局异常处理器 3.2 统一响应格式 为了保持响应格式的一致性,建议创建统一的响应类: 3.3

yk_dflkg的博客 1418

SpringBoot统一返回值处理及异常处理

先整体看下代码结构: 返回结果封装类RestResult: @Data @AllArgsConstructor @NoArgsConstructor public class RestResult { private Integer code; private String message; private Object data; public static...

Megustas_JJC的博客 1821

SpringBoot 如何进行 统一异常处理

首先,你需要根据自己的需求创建自定义的异常类。可以继承现有的异常类,比如RuntimeException,或者创建自己的异常类。自定义异常类应该包含错误码和错误消息等必要的信息。// 构造方法// getter和setter方法。

· 3602
上一篇: SpringBoot(四):统一异常处理
下一篇: SpringBoot(五):自定义属性获取
yjgithub
博客等级 码龄11年 53粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值