定义注解类
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
String value() default "";
}
日志切面实现(AOP实现)
- 定义切面类-注解@Aspect
- 定义切点-@pointcut(表明需要通过什么方式进行切 @execution() ||@annotation等 )
- 切面通知-前置通知、后置通知、环绕通知(@After @Before @Around @AfterReturing @AfterThrowing)
- 连接点-JoinPoint 以及ProceedingJoinPoint(@Around 环绕通知需要通过该类来处理)类,记录了,切点方法的入参及类信息
@Component
@Aspect
public class LogAspect {
private static final Logger LOGGER = LoggerFactory.getLogger(LogAspect.class);
@Pointcut("@annotation(com.common.Log)")
private void log(){}
@Around("log()")
public Object handler(ProceedingJoinPoint point) throws Throwable{
Object object = new Object();
StopWatch stopWatch = new StopWatch("logPrintStopWatch");
String errorMsg = null;
try {
LOGGER.info("log print start");
stopWatch.start();
try{
object = point.proceed();
}catch (Throwable e){
errorMsg = e.getMessage();
stopWatch.stop();
throw e;
}
stopWatch.stop();
return object;
}finally {
Object[] args = point.getArgs();
String clazz = point.getTarget().getClass().getName();
String method = point.getSignature().getName();
try{
// 记录日志信息
LOGGER.info("记录日志-参数:{},类名-{},方法-{}",args,clazz,method);
}catch (Exception e){
LOGGER.error("插入记录失败-{}",e.getMessage());
}
LOGGER.info("log print end");
}
}
}
该切面日志通过在方法里注解Log,可以实现日志的统一输出(也可以通过切某个目录下的类方法通过@execution()定义)