spring aop记录日志,Log4j

使用Aop做操作日志,异常处理,并记录日志。

方法1:try{}catch(){记录日志}

方法2:通过filter,或者strtus2拦截器(目前项目是struts2)

方法3:hirbernate的拦截器记录日志

方法4:通过jvm agent 代理

方法5:自定义类加载器应该也可以

虽然说各有个的好处吧,但是我个人还是喜欢Aop,当然Aop有多种实现。目前项目上用的是Spring Aop的 Aspect 。

我觉得使用Aop会更加的解耦合,更加的从其他的业务代码中分离出来。和上一篇做方法缓存差不多,上代码。

 

首先定义个注解,用于记录该方法的描述

Java代码   收藏代码
  1. import java.lang.annotation.Documented;  
  2. import java.lang.annotation.ElementType;  
  3. import java.lang.annotation.Retention;  
  4. import java.lang.annotation.RetentionPolicy;  
  5. import java.lang.annotation.Target;  
  6.   
  7. @Target({ElementType.METHOD,ElementType.TYPE})  
  8. @Retention(RetentionPolicy.RUNTIME)  
  9. @Documented  
  10. public @interface MethodLog {  
  11.     String remark() default "";  
  12. }  

 

   Action类

    

Java代码   收藏代码
  1. public class Sev {  
  2.     @MethodLog(remark="增加用户信息")  
  3.     public String addUser(int type,int parentid){  
  4.         return "";  
  5.     }  
  6. }  

 

  Aop 类

   

 

Java代码   收藏代码
  1. package com.zhang.shine.cache;  
  2.   
  3. import java.lang.reflect.Method;  
  4.   
  5. import org.aspectj.lang.ProceedingJoinPoint;  
  6. import org.aspectj.lang.annotation.Around;  
  7. import org.aspectj.lang.annotation.Aspect;  
  8. import org.aspectj.lang.annotation.Pointcut;  
  9.   
  10. @Aspect  
  11. public class MethodLogAspectJ {  
  12.   
  13.     @Pointcut("@annotation(com.zhang.shine.cache.MethodLog)")  
  14.     public void methodCachePointcut() {  
  15.     }  
  16.   
  17.     @Around("methodCachePointcut()")  
  18.     public Object methodCacheHold(ProceedingJoinPoint joinPoint)  
  19.             throws Throwable {  
  20.         System.out.println("aop start ");  
  21.         String methodRemark = getMthodRemark(joinPoint);  
  22.         Object result = null;  
  23.         try {  
  24.             // 记录操作日志...谁..在什么时间..做了什么事情..  
  25.             result = joinPoint.proceed();  
  26.         } catch (Exception e) {  
  27.             // 异常处理记录日志..log.error(e);  
  28.             throw e;  
  29.         }  
  30.   
  31.         System.out.print(methodRemark);  
  32.         System.out.println("aop end ");  
  33.         return result;  
  34.     }  
  35.   
  36.     // 获取方法的中文备注____用于记录用户的操作日志描述  
  37.     public static String getMthodRemark(ProceedingJoinPoint joinPoint)  
  38.             throws Exception {  
  39.         String targetName = joinPoint.getTarget().getClass().getName();  
  40.         String methodName = joinPoint.getSignature().getName();  
  41.         Object[] arguments = joinPoint.getArgs();  
  42.   
  43.         Class targetClass = Class.forName(targetName);  
  44.         Method[] method = targetClass.getMethods();  
  45.         String methode = "";  
  46.         for (Method m : method) {  
  47.             if (m.getName().equals(methodName)) {  
  48.                 Class[] tmpCs = m.getParameterTypes();  
  49.                 if (tmpCs.length == arguments.length) {  
  50.                     MethodLog methodCache = m.getAnnotation(MethodLog.class);  
  51.                     methode = methodCache.remark();  
  52.                     break;  
  53.                 }  
  54.             }  
  55.         }  
  56.         return methode;  
  57.     }  
  58.   
  59. }  

   <aop:config>节点中proxy-target-class="true"不为true时。

当登录的时候会报这个异常java.lang.NoSuchMethodException: $Proxy54.login(),

是因为代理Action类的时候,如果Proxy-targer-class=false,默认是用jdk动态代理。

所以代理不了Action类。

你可能感兴趣的:(spring aop记录日志,Log4j)