LoggingAdvice.java
package com.tradecloud.infrastructure.logging;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.ProceedingJoinPoint;
public class LoggingAdvice {
public enum Level {
DEBUG {
public void log(Log log, String message) {
log.debug(message);
}
},
INFO {
public void log(Log log, String message) {
log.info(message);
}
},
WARN {
public void log(Log log, String message) {
log.warn(message);
}
},
ERROR {
public void log(Log log, String message) {
log.error(message);
}
};
abstract void log(Log log, String message);
}
private static final String FORMAT = "%s [ %s ] %s.%s (%s) %s";
private Log log = LogFactory.getLog(LoggingAdvice.class);
private Level level = Level.DEBUG;
private String prefix = "exec";
private String suffix = "";
public LoggingAdvice() {
}
public LoggingAdvice(Level level, Log log, String prefix, String suffix) {
this.level = level;
this.log = log;
this.suffix = suffix;
this.prefix = prefix;
}
/**
* Log input and return values of this method.
*
* @param pjp
* the method to execute.
* @return what the {@link ProceedingJoinPoint} returns.
* @throws Throwable
* what the {@link ProceedingJoinPoint} throws.
*/
public Object log(final ProceedingJoinPoint pjp) throws Throwable {
Object retVal = null;
try {
retVal = pjp.proceed();
} finally {
StringBuilder args = new StringBuilder();
for (int x = 0; x < pjp.getArgs().length; x++) {
String str = String.valueOf(pjp.getArgs()[x]);
args.append(StringUtils.abbreviate(str, 50));
if (x != pjp.getArgs().length - 1) {
args.append(",");
}
}
level.log(log, String.format(FORMAT, prefix, StringUtils.abbreviate(String.valueOf(retVal), 50), pjp.getTarget().getClass()
.getSimpleName(), pjp.getSignature().getName(), args.toString(), suffix));
}
return retVal;
}
}