package org.nutz.aop.interceptor;
import org.nutz.aop.AopCallback;
import org.nutz.aop.InterceptorChain;
import org.nutz.aop.MethodInterceptor;
import org.nutz.lang.Lang;
import org.nutz.log.Log;
import org.nutz.log.Logs;
/**
* 为方法添加Log
* @author wendal(wendal1985@gmail.com)
*
*/
public class LoggingMethodInterceptor implements MethodInterceptor {
private static final Log LOG = Logs.get();
protected boolean logBeforeInvoke;
protected boolean logAfterInvoke;
protected boolean logWhenException;
protected boolean logWhenError;
public LoggingMethodInterceptor() {
this.logBeforeInvoke = LOG.isDebugEnabled();
this.logAfterInvoke = LOG.isDebugEnabled();
this.logWhenException = LOG.isDebugEnabled();
this.logWhenError = LOG.isDebugEnabled();
}
public void setLogEvent(boolean logBeforeInvoke,
boolean logAfterInvoke,
boolean logWhenException,
boolean logWhenError) {
this.logBeforeInvoke = logBeforeInvoke && LOG.isDebugEnabled();
this.logAfterInvoke = logAfterInvoke && LOG.isDebugEnabled();
this.logWhenException = logWhenException && LOG.isDebugEnabled();
this.logWhenError = logWhenError && LOG.isDebugEnabled();
}
public void filter(InterceptorChain chain) {
try {
if (logBeforeInvoke)
LOG.debugf("[beforeInvoke] Obj = %s , Method = %s , args = %s",
toString(chain.getCallingObj()),
chain.getCallingMethod(),
str(chain.getArgs()));
chain.doChain();
}
catch (Exception e) {
if (logWhenException)
LOG.debugf("[whenException] Obj = %s , Throwable = %s , Method = %s , args = %s",
toString(chain.getCallingObj()),
e,
chain.getCallingMethod(),
str(chain.getArgs()));
throw Lang.wrapThrow(e);
}
catch (Throwable e) {
if (logWhenError)
LOG.debugf("[whenError] Obj = %s , Throwable = %s , Method = %s , args = %s",
toString(chain.getCallingObj()),
e,
chain.getCallingMethod(),
str(chain.getArgs()));
throw Lang.wrapThrow(e);
}
finally {
if (logAfterInvoke)
LOG.debugf("[afterInvoke] Obj = %s , Return = %s , Method = %s , args = %s",
toString(chain.getCallingObj()),
chain.getReturn(),
chain.getCallingMethod(),
str(chain.getArgs()));
}
}
protected static final String toString(Object object) {
if (object != null )
if (object instanceof AopCallback)
return "[" + object.getClass().getName() + "]";
String str = String.valueOf(object);
if (str.length() > 100)
str = str.substring(0,97) + "...";
return str;
}
protected static final String str(Object... args) {
if (args == null || args.length == 0)
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
for (Object object : args)
sb.append(toString(object)).append(",");
sb.replace(sb.length() - 1, sb.length(), "]");
return sb.toString();
}
}