前言:
今天,小boss提了一个加日志的需求如下:
调用前日记记录:请求参数信息,请求时间,请求功能。。。
调用后日记记录:调用执行时间,调用执行结果。。。
过程:
public class AcctProxy {
public static Object[] params = new Object[10];
private static String contextName;
public static void setParams(Object[] options) {
params = options;
}
@SuppressWarnings("unchecked")
public static <T> T getProxy(AcctSubContext clz) {
LogAdvice ad = new LogAdvice();
Object proxyobj = (AcctSubContext)Proxy.newProxyInstance(
clz.getClass().getClassLoader(),
clz.getClass().getInterfaces(),
new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object obj = null;
Long a = System.currentTimeMillis();
try {
ad.beforeMethod(new Date().toString());
obj = method.invoke(clz, args);
ad.afterMethod(new Date().toString());
return obj;
} finally {
ad.afterReturn("核算处理耗时: " + (System.currentTimeMillis() - a) + "ms,处理结果:" + obj);
}
}
}
);
return (T)proxyobj;
}
interface Advice{
void beforeMethod(String info);
void afterMethod(String info);
}
private static class LogAdvice implements Advice{
protected Logger log = LoggerFactory.getLogger(getClass());
@Override
public void beforeMethod(String info) {
log.info("接收到核算["+contextName+"]请求参数:" + params[0] + ";" + params[1] + ";" + info );
}
@Override
public void afterMethod(String info) {
log.info("核算["+contextName+"]处理完成" + info);
}
public void afterReturn(String info){
log.info(info);
}
}
public static void setContextName(String name){
contextName = name;
}
public static AcctSubContext getSubContext(AcctContext acctContext, String ctx, Object... options) {
setParams(options);
setContextName(ctx);
AcctSubContext context = null;
context = (AcctSubContext) acctContext.getSubContext(ctx);
return getProxy(context);
}
}