Tag Archives: Debugging

Ultimate AspectJ method tracing

In last post and previous one I had shown how to setup AspectJ waving. There were also sample of simple method tracing. Here goes ultimate version:


package com.sample.utils;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Aspect
public class MyLogger {

private static final Logger logger = LoggerFactory.getLogger(MyLogger.class);

public MyLogger() {
}

@Before("execution(* com.klasses..*(..))")
public void logBefore(JoinPoint point) {
logger.trace("Autotrace entry {}.{}({})", point.getSignature().getDeclaringTypeName(), point.getSignature()
.getName(), point.getArgs());
}

@AfterReturning(pointcut = "execution(* com.klasses..*(..))", returning = "result")
public void logAfter(JoinPoint point, Object result) {

boolean hasReturnValue = true;

if (point.getSignature() instanceof MethodSignature) {
hasReturnValue = !((MethodSignature) point.getSignature()).getReturnType().getCanonicalName().equals("void");
}

if (hasReturnValue) {
logger.trace("Autotrace exit {}.{}({}) returned {}", point.getSignature().getDeclaringTypeName(), point
.getSignature().getName(), point.getArgs(), result);
}
else {
logger.trace("Autotrace exit {}.{}({})", point.getSignature().getDeclaringTypeName(), point.getSignature()
.getName(), point.getArgs());
}

}

@AfterThrowing(pointcut = "execution(* com.klasses..*(..))", throwing = "error")
public void logThrow(JoinPoint point, Throwable error) {
logger.trace("Autotrace exit {}.{}({}) throwed {}", point.getSignature().getDeclaringTypeName(), point
.getSignature().getName(), point.getArgs(), error);
}
}