1、先定义aop
package cn.com.taiji.lawenforcement.logger.aop; import cn.com.taiji.lawenforcement.core.config.UserInfoContext; import cn.com.taiji.lawenforcement.logger.entity.OperationLog; import cn.com.taiji.lawenforcement.logger.service.IOperationLogService; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.*; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Method; import java.time.LocalDateTime; import java.util.HashMap; import java.util.Map; /** * 日志切面 */ @Aspect @Component @Slf4j @MapperScan("cn.com.taiji.lawenforcement.logger.mapper") public class OperationLogAspect { private ThreadLocal<OperationLog> operationLogThreadLocal = new ThreadLocal<>(); @Autowired IOperationLogService logService; /** * 前置通知,方法调用前触发 -记录开始时间 */ @Before("@annotation(cn.com.taiji.lawenforcement.logger.annotation.OperationLog)") public void beforeAdvice(JoinPoint joinPoint) { // 记录方法开始执行的时间 // 接收到请求,记录请求内容 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder .getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); Map<String,String> descMap = new HashMap<>(); try { descMap = getControllerMethodDescription(joinPoint); } catch (Exception e) { e.printStackTrace(); } //获取当前登录人信息 UserInfoContext.UserInfo userInfo = UserInfoContext.currentUserInfo(); OperationLog operationLog = OperationLog.builder() .startTime(String.valueOf(System.currentTimeMillis())) .clientIp(request.getRemoteAddr()) .deptId((null!=userInfo)?userInfo.getDeptId():"") .orgId((null!=userInfo)?userInfo.getOrgId():"") .userId((null!=userInfo)?userInfo.getUserId():"") .requestUri(request.getRequestURI()) .logDesc(descMap.get("desc")) .logModule(descMap.get("module")) .logOperationType(descMap.get("operationType")) .build(); operationLogThreadLocal.set(operationLog); } /** * 后置通知,在目标方法完成之后调用通知,此时不会关 心方法的输出是什么 */ @After("@annotation(cn.com.taiji.lawenforcement.logger.annotation.OperationLog)") public void afterAdvice(JoinPoint joinPoint) { OperationLog operationLog = operationLogThreadLocal.get(); operationLog.setEndTime(String.valueOf(System.currentTimeMillis())); operationLog.setOperationTime(LocalDateTime.now()); logService.save(operationLog); } private static Map<String, String> getControllerMethodDescription(JoinPoint joinPoint) throws Exception { String targetName = joinPoint.getTarget().getClass().getName(); String methodName = joinPoint.getSignature().getName(); Object[] arguments = joinPoint.getArgs(); Class targetClass = Class.forName(targetName); Method[] methods = targetClass.getMethods(); Map<String, String> temp = new HashMap<>(); for (Method method : methods) { if (method.getName().equals(methodName)) { Class[] clazzs = method.getParameterTypes(); if (clazzs.length == arguments.length) { if (method.getAnnotation(cn.com.taiji.lawenforcement.logger.annotation.OperationLog.class) != null) { temp.put("module", method.getAnnotation(cn.com.taiji.lawenforcement.logger.annotation.OperationLog.class).module()); temp.put("operationType", method.getAnnotation(cn.com.taiji.lawenforcement.logger.annotation.OperationLog.class).operationType()); temp.put("desc", method.getAnnotation(cn.com.taiji.lawenforcement.logger.annotation.OperationLog.class).desc()); break; } } } } return temp; } }
2、定义注解
package cn.com.taiji.lawenforcement.logger.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.METHOD}) public @interface OperationLog { // 模块名称 String module() default ""; // 日志操作类型 String operationType() default ""; // 描述信息 String desc() default ""; }
3、日志操作类型
package cn.com.taiji.lawenforcement.logger.annotation; public interface OperationType { public static String ADD = "add"; public static String DELETE ="delete"; public static String EDIT ="edit"; public static String QUERY = "query"; public static String LOGINOUT ="loginOut"; public static String LOGININ ="loginIn"; public static String UPLOAD ="upload"; public static String DOWNLOAD ="download"; public static String IMPORT ="import"; public static String EXPORT ="export"; }
4、实体类
package cn.com.taiji.lawenforcement.logger.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import lombok.experimental.Accessors; import java.io.Serializable; import java.time.LocalDateTime; @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("tj_operation_log") @Builder @NoArgsConstructor @AllArgsConstructor public class OperationLog implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Long id; /** * 用户id */ @TableField("user_id") private String userId; /** * 部门id */ @TableField("dept_id") private String deptId; /** * 用户姓名 */ @TableField("user_name") private String userName; /** * 局级id */ @TableField("org_id") private String orgId; /** * 调用开始时间 */ @TableField("start_time") private String startTime; /** * 调用结束时间 */ @TableField("end_time") private String endTime; /** * 操作描述 */ @TableField("log_desc") private String logDesc; /** * 操作模块 */ @TableField("log_module") private String logModule; /** * 操作类型 */ @TableField("log_operation_type") private String logOperationType; /** * 请求路径 */ @TableField("request_uri") private String requestUri; /** * 客户端ip */ @TableField("client_ip") private String clientIp; /** * 操作时间 */ @TableField("operation_time") private LocalDateTime operationTime; /** * 备注 */ @TableField("remark") private String remark; }
5、log4j2配置文件
在我的资源下载
6、在依赖里,排除logging
<exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions>
7、使用:
在接口上直接添加就可以
@OperationLog(module = "添加商品模块", desc = "添加商品操作", operationType = OperationType.ADD)
8、库里保存数据
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/124560.html