1. 简介
项目中对日志的收集往往是非常重要的,不仅方便开发人员快速定位问题,而且越来越多的客户需要查询用户行为日志、用户审计日志等。因此,在收集日志时,不仅要考虑功能实现,而且要考虑可靠性、稳定性和不耦合性。 在每个操作和每个方法都加上日志处理肯定时不现实的,因此使用Spring提供的AOP原理就变得非常方便。定义好切面以及切点之后,可以非常方便的打印、收集或保存日志,不影响业务性能。
2. 初始化数据库
创建数据库aop,并初始化表结构:
DROP TABLE IF EXISTS `sys_log`;
CREATE TABLE `sys_log` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID',
`log_type` varchar(50) NOT NULL COMMENT '日志类型',
`create_user_code` varchar(64) NOT NULL COMMENT '创建用户编码',
`create_user_name` varchar(100) NOT NULL COMMENT '创建用户名称',
`create_date` datetime NOT NULL COMMENT '创建时间',
`request_uri` varchar(500) DEFAULT NULL COMMENT '请求URI',
`request_method` varchar(10) DEFAULT NULL COMMENT '请求方式',
`request_params` text COMMENT '请求参数',
`request_ip` varchar(20) NOT NULL COMMENT '请求IP',
`server_address` varchar(50) NOT NULL COMMENT '请求服务器地址',
`is_exception` char(1) DEFAULT NULL COMMENT '是否异常',
`exception_info` text COMMENT '异常信息',
`start_time` datetime NOT NULL COMMENT '开始时间',
`end_time` datetime NOT NULL COMMENT '结束时间',
`execute_time` int DEFAULT NULL COMMENT '执行时间',
`user_agent` varchar(500) DEFAULT NULL COMMENT '用户代理',
`device_name` varchar(100) DEFAULT NULL COMMENT '操作系统',
`browser_name` varchar(100) DEFAULT NULL COMMENT '浏览器名称',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_sys_log_lt` (`log_type`) USING BTREE,
KEY `idx_sys_log_cub` (`create_user_code`) USING BTREE,
KEY `idx_sys_log_ie` (`is_exception`) USING BTREE,
KEY `idx_sys_log_cd` (`create_date`) USING BTREE
) COMMENT='系统日志表';
3. 示例代码
创建项目
修改pom.xml
4.0.0
com.c3stones
spring-aop-log-demo
0.0.1-SNAPSHOT
spring-aop-log-demo
Spring Aop Log Demo
org.springframework.boot
spring-boot-starter-parent
2.3.4.RELEASE
mysql
mysql-connector-java
com.baomidou
mybatis-plus-boot-starter
3.3.2
org.projectlombok
lombok
true
cn.hutool
hutool-all
5.5.1
org.springframework.boot
spring-boot-starter-aop
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
创建配置文件application.yml
server:
port: 8080
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/aop?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
username: root
password: 123456
# Mybatis-plus配置
mybatis-plus:
mapper-locations: classpath:mapper/*.xml
global-config:
db-config:
id-type: AUTO
# configuration:
# # 打印sql
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
创建公共参数类
/**
* 公共常量类
*
* @author CL
*/
public interface Global {
/**
* 成功标识
*/
Boolean TRUE = true;
/**
* 失败标识
*/
Boolean FALSE = false;
/**
* 是标识
*/
String YES = "1";
/**
* 否标识
*/
String NO = "0";
/**
* 日志级别-INFO
*/
String LOG_INGO = "INFO";
/**
* 日志级别-DEBUG
*/
String LOG_DEBUG = "DEBUG";
/**
* 日志级别-ERROR
*/
String LOG_ERROR = "ERROR";
}
创建工具类
import java.io.Serializable;
import com.c3stones.constants.Global;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
/**
* 响应工具类
*
* @param
* @author CL
*/
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class R implements Serializable {
private static final long serialVersionUID = 1L;
@Getter
@Setter
private Boolean code;
@Getter
@Setter
private String msg;
@Getter
@Setter
private T data;
public static R ok() {
return restResult(null, Global.TRUE, null);
}
public static R ok(T data) {
return restResult(data, Global.TRUE, null);
}
public static R ok(T data, String msg) {
return restResult(data, Global.TRUE, msg);
}
public static R failed() {
return restResult(null, Global.FALSE, null);
}
public static R failed(String msg) {
return restResult(null, Global.FALSE, msg);
}
public static R failed(T data) {
return restResult(data, Global.FALSE, null);
}
public static R failed(T data, String msg) {
return restResult(data, Global.FALSE, msg);
}
private static R restResult(T data, Boolean code, String msg) {
R apiResult = new R();
apiResult.setCode(code);
apiResult.setData(data);
apiResult.setMsg(msg);
return apiResult;
}
}
/**
* 字节转换工具类
*
* @author CL
*/
public class ByteUtils {
private static final int UNIT = 1024;
/**
* 格式化字节大小
*
* @param byteSize 字节大小
* @return
*/
public static String formatByteSize(long byteSize) {
if (byteSize |