java - 如何在自定义 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 的值,以便我们不再看到对该路由的调用有任何限制。
我在源文件ClientConnectionPoolManager
和RestTemplate
源文件中看不到任何日志记录,那么如何为它们启用日志记录以获取池值?
@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);
}
解决方案
在 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
推荐阅读
- php - 如何从 curl 请求中获取格式化的 json?
- javascript - Javascript 交换对象元素
- javascript - 使用 discord.js 检测图像并响应
- swift - Swift:让自定义进度视图跟随用户点击?贝塞尔
- javascript - 动态下拉列表没有结果
- java - 在 MacOS High Sierra 上设置 Hadoop 单节点时遇到问题
- angular - 为什么 Angular 2+ 中的 http 服务的承诺被放弃了?
- javascript - 使用速记更新对象数组和 setState
- wordpress - AMP for WordPress:主页 /amp 仅显示右栏小部件
- spring-mvc - 使用 Enunciate 记录返回二进制文件 (image/png) 的端点