From 501538f47b57ecabec61b2ae6b829d8ccf42e583 Mon Sep 17 00:00:00 2001 From: LGH <1242479791@qq.com> Date: Wed, 22 Apr 2020 09:50:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BB=9F=E4=B8=80=E7=9A=84?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E6=97=A5=E5=BF=97=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/统一的系统日志.md | 90 ++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 doc/统一的系统日志.md diff --git a/doc/统一的系统日志.md b/doc/统一的系统日志.md new file mode 100644 index 0000000..31c975b --- /dev/null +++ b/doc/统一的系统日志.md @@ -0,0 +1,90 @@ +## 系统日志 + +利用`spring`框架中`aop`,我们可以实现业务代码与系统级服务进行解耦,例如日志记录、事务及其他安全业务等,可以使得我们的工程更加容易维护、优雅。如何在系统中添加相应的日志呢? + +##### 添加依赖 + +``` + + org.springframework.boot + spring-boot-starter-aop + +``` + +##### 自定义注解 + +```java +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface SysLog { + String value() default ""; +} + +``` + +##### 配置切面 + +```java +@Aspect +@Component +public class SysLogAspect { + @Autowired + private SysLogService sysLogService; + private static Logger logger = LoggerFactory.getLogger(SysLogAspect.class); + + @Around("@annotation(sysLog)") + public Object around(ProceedingJoinPoint joinPoint,com.yami.shop.common.annotation.SysLog sysLog) throws Throwable { + long beginTime = SystemClock.now(); + //执行方法 + Object result = joinPoint.proceed(); + //执行时长(毫秒) + long time = SystemClock.now() - beginTime; + + SysLog sysLogEntity = new SysLog(); + if(sysLog != null){ + //注解上的描述 + sysLogEntity.setOperation(sysLog.value()); + } + + //请求的方法名 + String className = joinPoint.getTarget().getClass().getName(); + String methodName = joinPoint.getSignature().getName(); + sysLogEntity.setMethod(className + "." + methodName + "()"); + + //请求的参数 + Object[] args = joinPoint.getArgs(); + String params = Json.toJsonString(args[0]); + sysLogEntity.setParams(params); + + //设置IP地址 + sysLogEntity.setIp(IPHelper.getIpAddr()); + //用户名 + String username = SecurityUtils.getSysUser().getUsername(); + sysLogEntity.setUsername(username); + sysLogEntity.setTime(time); + sysLogEntity.setCreateDate(new Date()); + //保存系统日志 + sysLogService.save(sysLogEntity); + return result; + } + +} +``` + +将自定义的注解作为切入点,参数是`ProceedingJoinPoint`和`sysLog`,`ProceedingJoinPoint`用来获取当前执行的方法,`syslog`用来获取注解里面的值。 + +#### 在需要记录日志的方法上,添加注解`@SysLog(value)` + +```java +@SysLog("修改角色") +@PutMapping +@PreAuthorize("@pms.hasPermission('sys:role:update')") +public ResponseEntity update(@RequestBody SysRole role){ + sysRoleService.updateRoleAndRoleMenu(role); + return ResponseEntity.ok().build(); +} +``` + +当操作这个方法时,将会被记录到数据库中,在日志管理中能看到相应操作的内容。 +![img](https://box.kancloud.cn/4ff625398e31974b7de6fe9e06c2b847_1373x202.png)