前言:
今天,小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); } }