如何写日志记录操作?

基于springboot 实现AOP日志管理

Posted by MasterJen on November 15, 2018

Hey AOP日志

Sharp tools make good work. – 工欲善其事,必先利其器.

我们开发的每个功能都是提供给客户使用,当客户对某个功能进行操作时,我们是怎么知道该用户在操作什么呢,在执行哪个功能呢,所以我们需要有日志进行记录客户的操作,方便我们管理.

首先导入日志的依赖包 (日志无非就是在操作某个功能是进行拦截,并且记录当前用户,其实就是动态代理)

      <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
        </dependency>

编写一个注解 用于存放操作人和操作目标

/*
*   日志的注解
* */
@Target(value ={ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface LogAnnoation {
  // 访问的方法
    String operationType();
   // 操作的名称
    String operationName();
}

在 需要进行操作的controller上面进行加此注解

  @LogAnnoation(operationType = "Login",operationName = "管理员登录")
    @RequestMapping("/login")
    public String Login(String username,String password) throws Exception {
            try{
                    userService.loginUser(username,password);
                    return "success";
                }catch(Exception e){
                  throw e;
            }
    }            

写一个AOP 工具类进行AOP 操作 当访问功能方法时 进行扫描,记录下来当前的用户与操作

@Aspect
@Component
public class LogAspectUtils {
    @Pointcut("execution(* com.master..controller.*.*(..))")
    public void pointCut(){
    }
    // 后置操作  当执行完方法后进行执行此操作
     @AfterReturning(pointcut = "pointCut()",returning = "o")
     public void afterResult(JoinPoint joinPoint, Object o) throws ClassNotFoundException {
//        得到类的名字
         String classname = joinPoint.getTarget().getClass().getName();
//        得到目标方法的名字
         String methodname = joinPoint.getSignature().getName();
//        获取参数
         Object[] args = joinPoint.getArgs();
//        得到所有的方法
         Class<?> aClass = Class.forName(classname);           
         Method[] methods = aClass.getMethods();
         for (Method method : methods) {
//            判断该类的方法与目标方法是否一致
             if(method.getName().equalsIgnoreCase(methodname)){
//                获取上面的注解
                 LogAnnoation annotation = method.getAnnotation(LogAnnoation.class);
                 if(annotation!=null){
//                    得到注解上面的值
                     String operationName = annotation.operationName();
                     // 得到 操作的功能  
                     String operationType = annotation.operationType();
                     SysAdmin user = ((SysAdmin) SecurityUtils.getSubject().getSession().getAttribute("user"));
                     System.out.println(operationName+"--> 被执行了--("+operationType+"),--> 参数是:-->"+ Arrays.deepToString(args)+(user == null?"":"  操作用户是-->"+user.getName())+" --> 时间是:"+(new Date()));
                 }
             }
         }
     }

获得日志后,就可以进行放到缓存或者数据库里了,方便查看管理.