import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import org.slf4j.impl.Log4jLoggerAdapter;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
/**
* 代理日志工厂类
*
* @author hyl 279241400@qq.com 2019年4月25日下午7:39:33
*
*/
public final class LogProxyFactory {
public final static LogProxy getProXy(Class<?> cls) {
try {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(LogProxy.class);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
Field nameField = Log4jLoggerAdapter.class.getDeclaredField("FQCN");
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(nameField, nameField.getModifiers() & ~Modifier.FINAL);
nameField.setAccessible(true);
nameField.set(null, cls.getName());
Object result = proxy.invokeSuper(obj, args);
nameField.set(null, Log4jLoggerAdapter.class.getName());
return result;
}
});
return (LogProxy) enhancer.create();
} catch (Exception e) {
e.printStackTrace();
}
return new LogProxy();
}
}
/**
* 代理日志定义
**/
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import cn.ws.core.util.enumtype.LogLevel;
/**
* 代理日志类
*
* @author hyl 279241400@qq.com 2019年4月25日下午4:10:07
*
*/
public class LogProxy {
private static final Logger log = LoggerFactory.getLogger(LogProxy.class);
/***
*
* @param level
* @param msg
*/
public void slf4jlog(LogLevel level, String msg) {
switch (level) {
case Info:
log.info(msg);
break;
case Waning:
log.warn(msg);
break;
case Error:
log.error(msg);
break;
default:
log.info(msg);
}
}
}
===============================================
使用方式:
import cn.ws.core.util.enumtype.LogLevel;
public class LogTest {
private final static LogProxy log = LogProxyFactory.getProXy(LogTest.class);
public static void test(String msg) {
log.slf4jlog(LogLevel.Info, msg);
}
}
log4J定义:
log4j.rootLogger=info, stdout
log4j.logger.cn.infome.bm=DEBUG
log4j.logger.javax.sql=DEBUG
#log4j.logger.org.springframework=DEBUG
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d (%F:%L) %-5p - %m%n
===================================================
自定义测试main
import org.apache.log4j.BasicConfigurator;
import cn.ws.util.LogTest;
public class Log {
public static void main(String[] args) {
LogTest.test("测试");
}
}