首页 > 解决方案 > 如何在自定义 RestTemplate 中启用 Default ConnectionPool 的日志记录?

问题描述

在我的一个项目(spring-mvc不是spring-boot)中,我们定制了RestTemplate(下)的 Bean 配置。这用于多个地方以在多线程环境中制作多个。呼叫所有路线都可以正常工作,除了一条。对于那个,我们最终由于ResourceAccessException.

org.springframework.web.client.ResourceAccessException: I/O error on GET request for "https://abc.xyz.com/Search": Request aborted; nested exception is org.apache.http.impl.execchain.RequestAbortedException: Request aborted
        at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:674)
        at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:636)
        at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:557)
        at 

由于它仅针对一条路由而不是针对所有路由发生,我们认为问题是因为该路由有很多请求,而 ResTemplate 中使用的默认池可能是原因。作为第一步,我们希望确定这一点,因此希望为 ClientConnectionPoolManager启用适当的日志,以便下一步我们可以调整 pool 的值,以便我们不再看到对该路由的调用有任何限制。

我在源文件ClientConnectionPoolManagerRestTemplate源文件中看不到任何日志记录,那么如何为它们启用日志记录以获取池值?

@Bean
@Qualifier("ssl-bypass-all")
public RestTemplate restTemplate() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
    TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true;

    SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom()
            .loadTrustMaterial(null, acceptingTrustStrategy)
            .build();

    SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext);

    CloseableHttpClient httpClient = HttpClients.custom()
            .setSSLSocketFactory(csf)
            .build();

    HttpComponentsClientHttpRequestFactory requestFactory =
            new HttpComponentsClientHttpRequestFactory();
    requestFactory.setHttpClient(httpClient);
    return new RestTemplate(requestFactory);
}

标签: javaspring-mvcconnection-poolingresttemplate

解决方案


在 log4j.properties 中只添加了一行:

log4j.logger.org.apache.http.impl.conn.PoolingHttpClientConnectionManager=DEBUG, HttpConnectionPool

整个 log4j.properties 文件是:

log4j.rootLogger=INFO, Default
log4j.appender.Default=org.apache.log4j.RollingFileAppender
log4j.appender.Default.File=${APP_HOME}/logs/app-name.log
log4j.appender.Default.layout=org.apache.log4j.PatternLayout
log4j.appender.Default.layout.ConversionPattern=[%d{DATE}] %-5p %c %x - [%X{profiler-ink}] : %m%n%n
log4j.appender.Default.MaxFileSize=5MB
log4j.appender.Default.MaxBackupIndex=200
log4j.appender.Default.Append=true


log4j.logger.org.apache.http.impl.conn.PoolingHttpClientConnectionManager=DEBUG, HttpConnectionPool

log4j.appender.HttpConnectionPool=org.apache.log4j.FileAppender
log4j.appender.HttpConnectionPool.File=${APP_HOME}/logs/check-availability-pool.log
log4j.appender.HttpConnectionPool.layout=org.apache.log4j.PatternLayout
log4j.appender.HttpConnectionPool.layout.ConversionPattern=[%d{DATE}] %-5p %c %x - [%X{profiler-ink}] : %m%n%n
log4j.appender.HttpConnectionPool.MaxFileSize=5MB
log4j.appender.HttpConnectionPool.MaxBackupIndex=200
log4j.appender.HttpConnectionPool.Append=true

推荐阅读