首页

Java基本框架设计之统一的系统日志

标签:系统日志注解     发布时间:2023-04-17   

一、前言

利用'spring'框架中'aop',我们可以实现业务代码与系统级服务进行解耦,例如日志记录、事务及其他安全业务等,可以使得我们的工程更加容易维护、优雅。如何在系统中添加相应的日志呢?

二、代码示例

1)添加依赖

<dependency>@b@    <groupId>org.springframework.boot</groupId>@b@    <artifactId>spring-boot-starter-aop</artifactId>@b@</dependency>

2)自定义注解

@Target(ElementType.METHOD)@b@@Retention(RetentionPolicy.RUNTIME)@b@@Documented@b@public @interface SysLog {@b@    String value() default "";@b@}

3)配置切面 - 将自定义的注解作为切入点,参数是'ProceedingJoinPoint'和'sysLog','ProceedingJoinPoint'用来获取当前执行的方法,'syslog'用来获取注解里面的值。

@Aspect@b@@Component@b@public class SysLogAspect {@b@    @Autowired@b@    private SysLogService sysLogService;@b@    private static Logger logger = LoggerFactory.getLogger(SysLogAspect.class);@b@@b@    @Around("@annotation(sysLog)")@b@    public Object around(ProceedingJoinPoint joinPoint,com.yami.shop.common.annotation.SysLog sysLog) throws Throwable {@b@        long beginTime = SystemClock.now();@b@        //执行方法@b@        Object result = joinPoint.proceed();@b@        //执行时长(毫秒)@b@        long time = SystemClock.now() - beginTime;@b@@b@        SysLog sysLogEntity = new SysLog();@b@        if(sysLog != null){@b@            //注解上的描述@b@            sysLogEntity.setOperation(sysLog.value());@b@        }@b@@b@        //请求的方法名@b@        String className = joinPoint.getTarget().getClass().getName();@b@        String methodName = joinPoint.getSignature().getName();@b@        sysLogEntity.setMethod(className + "." + methodName + "()");@b@@b@        //请求的参数@b@        Object[] args = joinPoint.getArgs();@b@        String params = Json.toJsonString(args[0]);@b@        sysLogEntity.setParams(params);@b@@b@        //设置IP地址@b@        sysLogEntity.setIp(IPHelper.getIpAddr());@b@        //用户名@b@        String username = SecurityUtils.getSysUser().getUsername();@b@        sysLogEntity.setUsername(username);@b@        sysLogEntity.setTime(time);@b@        sysLogEntity.setCreateDate(new Date());@b@        //保存系统日志@b@        sysLogService.save(sysLogEntity);@b@        return result;@b@    }@b@@b@}

4)@SysLog(value)注解示例 - 在需要记录日志的方法上

@SysLog("修改角色")@b@@PutMapping@b@@PreAuthorize("@pms.hasPermission('sys:role:update')")@b@public ServerResponseEntity<Void> update(@RequestBody SysRole role){@b@    sysRoleService.updateRoleAndRoleMenu(role);@b@    return ServerResponseEntity.success();@b@}












  • ◆ 相关内容