问题描述:今天老大告诉我说系统的Log日志要修改,有些参数不能打印,有些参数不能打印,有些参数要替换部分内容,要求系统要尽量小的修改。我修改了一天,现记录如下。
思路:
思路一. 定义方法,传入要打印参数和要替换的参数
思路二. 用注解或aop的方式实现,在对象的属性上加自定义注解,通过解析此注解,替换属性内容来达到目的
思路三. jdk的动态代理,代理log日志来实现
解析:
思路一可以实现,也能达到想要的效果,但是代码改动量太大。每个log日志处都要调用此方法,对于其他人来说代码的可读性不高,开销太大。
思路二通过注解加aop的方式,如果参数不是写在对象中的,则不能话则不能解决问题,而且在log.info中,无法得到对象中的内容
思路三是别人提醒我的,此方法为log日志实现代理,每个需要打印日志的类中,只要替换日志即可
实现:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @description 日志代理类.
* @author Silencer
* @date 2018-11-13 21:55:23
* @version v_1.0
*/
public class LoggerProxy implements InvocationHandler {
private Logger logger;
public LoggerProxy(Class<?> clazz) {
logger = LoggerFactory.getLogger(clazz);
}
public static Logger getLogger(Class<?> clazz) {
LoggerProxy proxy = new LoggerProxy(clazz);
return (Logger) Proxy.newProxyInstance(proxy.getClass().getClassLoader(), proxy.logger.getClass().getInterfaces(), proxy);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("操作前!");
Object invoke = method.invoke(logger, args);
System.out.println("操作后!");
return invoke;
}
}