Problem
spring.jpa.show-sql= true
Enter fullscreen mode
Exit fullscreen mode
But sometimes we need logs with more information such as params, batch batch,... like this one.
Solution
<dependency>
<groupId> net.ttddyy</groupId>
<artifactId> datasource-proxy</artifactId>
<version> 1.4.1</version>
</dependency>
Enter fullscreen mode
Exit fullscreen mode
// ...your package name
import java.lang.reflect.Method ;
import javax.sql.DataSource ;
import org.aopalliance.intercept.MethodInterceptor ;
import org.aopalliance.intercept.MethodInvocation ;
import org.springframework.aop.framework.ProxyFactory ;
import org.springframework.beans.BeansException ;
import org.springframework.beans.factory.config.BeanPostProcessor ;
import org.springframework.stereotype.Component ;
import org.springframework.util.ReflectionUtils ;
import net.ttddyy.dsproxy.listener.logging.SLF4JLogLevel ;
import net.ttddyy.dsproxy.support.ProxyDataSourceBuilder ;
@Component
public class DatasourceProxyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization ( final Object bean , final String beanName ) throws BeansException {
return bean ;
}
@Override
public Object postProcessAfterInitialization ( final Object bean , final String beanName ) throws BeansException {
if ( bean instanceof DataSource ) {
ProxyFactory factory = new ProxyFactory ( bean );
factory . setProxyTargetClass ( true );
factory . addAdvice ( new ProxyDataSourceInterceptor (( DataSource ) bean ));
return factory . getProxy ();
}
return bean ;
}
private static class ProxyDataSourceInterceptor implements MethodInterceptor {
private final DataSource dataSource ;
public ProxyDataSourceInterceptor ( final DataSource dataSource ) {
super ();
this . dataSource = ProxyDataSourceBuilder
. create ( dataSource )
. countQuery ()
. logQueryBySlf4j ( SLF4JLogLevel . INFO )
. build ();
}
@Override
public Object invoke ( final MethodInvocation invocation ) throws Throwable {
Method proxyMethod = ReflectionUtils . findMethod ( dataSource . getClass (), invocation . getMethod (). getName ());
if ( proxyMethod != null ) {
return proxyMethod . invoke ( dataSource , invocation . getArguments ());
}
return invocation . proceed ();
}
}
}
Enter fullscreen mode
Exit fullscreen mode
Refs
Top comments (0)