一点点

前言:

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






猜你喜欢

转载自blog.csdn.net/qq_31872713/article/details/80329758