首页  编辑  

Java 日志切面 @Log Aspect

Tags: /Java/   Date Created:
先看效果:

Log.java
  1. import java.lang.annotation.ElementType;
  2. import java.lang.annotation.Retention;
  3. import java.lang.annotation.RetentionPolicy;
  4. import java.lang.annotation.Target;
  5. @Target(ElementType.METHOD)
  6. @Retention(RetentionPolicy.RUNTIME)
  7. public @interface Log {
  8.     System.Logger.Level level() default System.Logger.Level.DEBUG;
  9.     String tag() default "";
  10. }


LogAspect.java

  1. import org.aspectj.lang.JoinPoint;
  2. import org.aspectj.lang.annotation.After;
  3. import org.aspectj.lang.annotation.Aspect;
  4. import org.aspectj.lang.annotation.Before;
  5. import org.aspectj.lang.annotation.Pointcut;
  6. import org.aspectj.lang.reflect.MethodSignature;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. import org.springframework.stereotype.Component;
  10. import java.util.Arrays;
  11. @Aspect
  12. @Component
  13. @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
  14. public class LogAspect {
  15.     private long marker;
  16.     private String className;
  17.     private String methodName;
  18.     private Log log;
  19.     private Logger logger;
  20.     @Pointcut("@annotation(tacos.util.Log)")
  21.     public void logPointCut() {
  22.     }
  23.     private void doLog(Logger logger, System.Logger.Level level, String msg) {
  24.         if (level == System.Logger.Level.DEBUG) {
  25.             logger.debug(msg);
  26.         } else if (level == System.Logger.Level.INFO) {
  27.             logger.info(msg);
  28.         } else if (level == System.Logger.Level.WARNING) {
  29.             logger.warn(msg);
  30.         } else if (level == System.Logger.Level.ERROR) {
  31.             logger.error(msg);
  32.         } else if (level == System.Logger.Level.TRACE) {
  33.             logger.trace(msg);
  34.         }
  35.     }
  36.     @Before("logPointCut()")
  37.     public void before(JoinPoint joinPoint) {
  38.         className = joinPoint.getTarget().getClass().getName();
  39.         methodName = joinPoint.getSignature().getName();
  40.         log = ((MethodSignature) joinPoint.getSignature()).getMethod().getAnnotation(Log.class);
  41.         logger = LoggerFactory.getLogger(className);
  42.         String msg = String.format("%sCall open: %s.%s(%s) ", log.tag(), className, methodName, Arrays.toString(joinPoint.getArgs()));
  43.         doLog(logger, log.level(), msg);
  44.         marker = System.currentTimeMillis();
  45.     }
  46.     @After("logPointCut()")
  47.     public void end(JoinPoint joinPoint) {
  48.         doLog(logger, log.level(), String.format("%sCall done: %s.%s, duration: %d ms", log.tag(), className, methodName, (System.currentTimeMillis() - marker)));
  49.     }
  50. //    @Around("logPointCut()")
  51. //    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
  52. //        String className = joinPoint.getTarget().getClass().getName();
  53. //        String methodName = joinPoint.getSignature().getName();
  54. //        Log log = ((MethodSignature) joinPoint.getSignature()).getMethod().getAnnotation(Log.class);
  55. //        Logger logger = LoggerFactory.getLogger(className);
  56. //        String msg = String.format("%sCall open: %s.%s(%s) ", log.tag(), className, methodName, Arrays.toString(joinPoint.getArgs()));
  57. //        doLog(logger, log.level(), msg);
  58. //        long beginTime = System.currentTimeMillis();
  59. //        Object result = joinPoint.proceed();
  60. //        long duration = System.currentTimeMillis() - beginTime;
  61. //        doLog(logger, log.level(), String.format("%sCall done: %s.%s, duration: %d ms", log.tag(), className, methodName, duration));
  62. //        return result;
  63. //    }
  64. }

使用:
在方法上使用注解即可:
  1.     @Log(level = System.Logger.Level.ERROR, tag = "[OK] ")