首页 > 其他分享 >SpringBoot记录日志

SpringBoot记录日志

时间:2024-08-30 10:38:19浏览次数:10  
标签:COMMENT SpringBoot 记录 DEFAULT private sysOperLog 日志 public String

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {        // 自定义操作日志记录注解

    public String title() ;                                // 模块名称
    public OperatorType operatorType() default OperatorType.MANAGE;    // 操作人类别
    public int businessType() ;     // 业务类型(0其它 1新增 2修改 3删除)
    public boolean isSaveRequestData() default true;   // 是否保存请求的参数
    public boolean isSaveResponseData() default true;  // 是否保存响应的参数

}

1.自定义@Log注解

这个注解的作用是通过在方法上添加@Log注解,自动记录操作日志。通过设置不同的属性值,可以定制日志的内容,包括操作模块、操作人类别、业务类型以及是否保存请求和响应参数等信息。

2.OperatorType

public enum OperatorType {        // 操作人类别
    OTHER,        // 其他
    MANAGE,        // 后台用户
    MOBILE        // 手机端用户
} 

3.@EnableLogAspect

定义一个注解,用于启用日志切面功能。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Import(value = LogAspect.class)            // 通过Import注解导入日志切面类到Spring容器中
public @interface EnableLogAspect {
 
}

在启动类中加入注解

 
@RefreshScope
@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients("com.huiye")
@EnableMongoRepositories("com.huiye")
@ComponentScan({"com.huiye"})
@MapperScan("com.huiye.core.mapper")
@EnableAspectJAutoProxy
@EnableScheduling

public class ManagerApplication {
public static void main(String[] args) {
SpringApplication.run(ManagerApplication.class , args);
}

}

 

4.定义切面类

 
@Aspect
@Component
@Slf4j
public class LogAspect {            // 环绕通知切面类定义
 
    @Autowired
    private AsyncOperLogService asyncOperLogService ;
 
    @Around(value = "@annotation(sysLog)")
    public Object doAroundAdvice(ProceedingJoinPoint joinPoint , Log sysLog) {
 
        // 构建前置参数
        SysOperLog sysOperLog = new SysOperLog() ;
 
        LogUtil.beforeHandleLog(sysLog , joinPoint , sysOperLog) ;
 
        Object proceed = null;
        try {
            proceed = joinPoint.proceed();
            // 执行业务方法
            LogUtil.afterHandleLog(sysLog , proceed , sysOperLog , 0 , null) ;
            // 构建响应结果参数
        } catch (Throwable e) {                                 // 代码执行进入到catch中,
            // 业务方法执行产生异常
            e.printStackTrace();                                // 打印异常信息
            LogUtil.afterHandleLog(sysLog , proceed , sysOperLog , 1 , e.getMessage()) ;
            throw new RuntimeException();
        }
 
        // 保存日志数据
        asyncOperLogService.save(sysOperLog);
 
        // 返回执行结果
        return proceed ;
    }
}

5.工具类

public class LogUtil {

//操作执行之后调用
public static void afterHandleLog(Log sysLog, Object proceed,
SysOperLog sysOperLog, int status ,
String errorMsg) {
if(sysLog.isSaveResponseData()) {
sysOperLog.setJsonResult(JSON.toJSONString(proceed));
}
sysOperLog.setStatus(status);
sysOperLog.setErrorMsg(errorMsg);
}

//操作执行之前调用
public static void beforeHandleLog(Log sysLog,
ProceedingJoinPoint joinPoint,
SysOperLog sysOperLog) {

// 设置操作模块名称
sysOperLog.setTitle(sysLog.title());
sysOperLog.setOperatorType(sysLog.operatorType().name());

// 获取目标方法信息
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature() ;
Method method = methodSignature.getMethod();
sysOperLog.setMethod(method.getDeclaringClass().getName());

// 获取请求相关参数
ServletRequestAttributes requestAttributes = (ServletRequestAttributes)
RequestContextHolder.getRequestAttributes();
HttpServletRequest request = requestAttributes.getRequest();
sysOperLog.setRequestMethod(request.getMethod());
sysOperLog.setOperUrl(request.getRequestURI());
sysOperLog.setOperIp(request.getRemoteAddr());

// 设置请求参数
if(sysLog.isSaveRequestData()) {
String requestMethod = sysOperLog.getRequestMethod();
if (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod)) {
String params = Arrays.toString(joinPoint.getArgs());
sysOperLog.setOperParam(params);
}
}
sysOperLog.setOperName(AuthContextUtil.get().getUserName());
}
}

 

afterHandleLog:
在操作执行后记录日志,根据sysLog属性决定是否保存操作结果,同时设置sysOperLog的状态码和错误信息。


beforeHandleLog:
在操作执行前记录日志,获取并设置操作模块、类型、方法信息、请求参数等,并根据sysLog属性决定是否保存请求数据,最后设置操作人名称。

 

6.定义切面类中用到的接口和实现类

 
public interface AsyncOperLogService extends IService<SysOperLog> {            // 保存日志数据
}

@Service
@RequiredArgsConstructor
public class AsyncOperLogServiceImpl extends ServiceImpl<SysOperLogMapper, SysOperLog> implements AsyncOperLogService {
private SysOperLogMapper sysOperLogMapper;
}

 

@Mapper
public interface SysOperLogMapper extends BaseMapper<SysOperLog> {
}

7.SysOperLog

 

定义一个与日志数据库表相对应的实体类

 

@Data
@Schema(description = "SysOperLog")

public class SysOperLog extends BaseEntity {

private static final long serialVersionUID = 1L;

@TableId(value = "id", type = IdType.AUTO)
private Long id;

@Schema(description = "模块标题")
private String title;

@Schema(description = "方法名称")
private String method;

@Schema(description = "请求方式")
private String requestMethod;

private Integer businessType ; // 业务类型(0其它 1新增 2修改 3删除)

@Schema(description = "操作类别(0其它 1后台用户 2手机端用户)")
private String operatorType;

@Schema(description = "操作人员")
private String operName;

@Schema(description = "请求URL")
private String operUrl;

@Schema(description = "主机地址")
private String operIp;

@Schema(description = "请求参数")
private String operParam;

@Schema(description = "返回参数")
private String jsonResult;

@Schema(description = "操作状态(0正常 1异常)")
private Integer status;

@Schema(description = "错误消息")
private String errorMsg;

}

 

8.表结构

 

CREATE TABLE `sys_oper_log` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志主键',
`title` varchar(50) DEFAULT '' COMMENT '模块标题',
`business_type` varchar(20) DEFAULT '0' COMMENT '业务类型(0其它 1新增 2修改 3删除)',
`method` varchar(100) DEFAULT '' COMMENT '方法名称',
`request_method` varchar(10) DEFAULT '' COMMENT '请求方式',
`operator_type` varchar(20) DEFAULT '0' COMMENT '操作类别(0其它 1后台用户 2手机端用户)',
`oper_name` varchar(50) DEFAULT '' COMMENT '操作人员',
`dept_name` varchar(50) DEFAULT '' COMMENT '部门名称',
`oper_url` varchar(255) DEFAULT '' COMMENT '请求URL',
`oper_ip` varchar(128) DEFAULT '' COMMENT '主机地址',
`oper_param` varchar(2000) DEFAULT '' COMMENT '请求参数',
`json_result` varchar(2000) DEFAULT '' COMMENT '返回参数',
`status` int DEFAULT '0' COMMENT '操作状态(0正常 1异常)',
`error_msg` varchar(2000) DEFAULT '' COMMENT '错误消息',
`oper_time` datetime DEFAULT NULL COMMENT '操作时间',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
`is_deleted` tinyint NOT NULL DEFAULT '0' COMMENT '删除标记(0:不可用 1:可用)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=67 DEFAULT CHARSET=utf8mb3 COMMENT='操作日志记录';

标签:COMMENT,SpringBoot,记录,DEFAULT,private,sysOperLog,日志,public,String
From: https://www.cnblogs.com/yylucky666/p/18388158

相关文章

  • [转帖]11GR2数据库审计日志自动清理
    审计日志如果把SYSTEM表空间撑爆,也会导致数据库停摆,且11g默认审计是开启状态。今天就遇到了这样的情况,写了下面脚本来实现自动清理工作,记录操作过程。TRUNCATETABLESYS.AUD$REUSESTORAGE;--对于已经被审计日志撑爆的数据库或者初始化清理工作时报错ORA-46267,强烈建议用......
  • oceanbase-3分钟带你看懂 GC 日志!
    3分钟带你看懂GC日志!------------------------------------------------------------------------------------ 01、背景介绍在之前的几篇文章中,我们介绍了 JVM内部布局、对象的创建过程、运行期的相关优化手段、垃圾对象的回收算法以及垃圾收集器等相关知识。那么如何......
  • 基于SpringBoot的大学生就业需求分析系统设计与实现
    作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,有较为丰富的相关经验。期待与各位高校教师、企业......
  • 全栈程序员 | 精通安卓、鸿蒙,小程序,Java、Vue.js、SpringBoot及更多技术
    我是一个全栈程序员,擅长多种开发技术,包括安卓开发、Java编程、Vue.js、SpringBoot以及小程序开发等。我在技术上有广泛的涉猎,并致力于将创新解决方案应用于实际项目中。无论是开发高性能的安卓应用,还是构建响应式网页、实现复杂的后端功能,我都能提供专业的技术支持和高质量的代......
  • SpringBoot把本地的对象封装成为Nacos的配置对象
    你需要有个NacosNacos建立你的配置文件--建议yml文件编写你的yml配置platform:transaction:properties:notifyHost:"http://10.130.1.18:${server.port.cztech-service-gateway}"smsTemplate:"TEM_0029"#订单默认过期时间--分钟defau......
  • 基于Springboot公寓电费管理系统的设计与实现(源码+LW+调试文档)
     目录:程序功能截图:程序部分代码参考:数据库sql:程序技术介绍:后端springboot介绍:mysql介绍:程序论文:​选择我的理由:程序获取:......
  • 基于SpringBoot大学生征兵入伍管理系统的设计与实现(源码+LW+调试文档)
     目录:程序功能截图:程序部分代码参考:数据库sql:程序技术介绍:后端springboot介绍:mysql介绍:程序论文:​选择我的理由:程序获取:......
  • Dell服务器导出日志
    iDRAC接口为网口准备工作:注:此文档适用于iDRAC接口为网口且与电源接口同侧的Dell服务器,如:R740带网口的笔记本电脑网线跳线操作方法:网线一端连接笔记本电脑,另一端连接服务器的iDRAC接口;查看笔记本电脑是否自动获取到192.168.0.*的ip地址,未获取到需设置同段的固定ip地址,如:1......
  • java毕业设计-基于springboot+vue的高校自习室预约系统设计和实现,基于springboot+vue
    文章目录前言演示视频项目架构和内容获取(文末获取)项目相关文件系统功能部分实现截图架构设计MVC的设计模式基于B/S的架构技术栈具体功能模块设计系统需求分析可行性分析系统测试为什么我?关于我我自己的网站项目开发案例前言博主介绍:✌️码农一枚,专注于大学生项目......
  • FTP上传日志文件
    1、/***d) 更新上传日志文件(把最新上传的“模号/文件名称”覆盖到LastFtpFile.log),*ftp://10.210.85.249/LastFtpFile.log,log内容举例:P10123-1/mcn-2300707-001.xlsx,*多条数据时换行存储。*/privatevoidupdateLog(String[]modelingNoArr,Li......