Spring Boot应用日志仅显示...23 more而非完整错误,如何查看全栈信息?
如何让Spring Boot日志显示完整的错误栈信息
问题描述
我在Spring Boot应用中遇到连接超时错误,尝试通过添加日志和try-catch块捕获处理,但日志始终显示截断的错误信息(带有... 23 more),无法准确定位错误发生的具体位置。日志内容如下:
com.amazonaws.SdkClientException: Unable to execute HTTP request: Connect to localhost:3128 [/localhost] failed: Connect timed out at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleRetryableException(AmazonHttpClient.java:1113) ~[aws-java-sdk-core-1.11.207.jar!/:?] at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1063) ~[aws-java-sdk-core-1.11.207.jar!/:?] at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:743) ~[aws-java-sdk-core-1.11.207.jar!/:?] at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:717) ~[aws-java-sdk-core-1.11.207.jar!/:?] at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:699) ~[aws-java-sdk-core-1.11.207.jar!/:?] at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:667) ~[aws-java-sdk-core-1.11.207.jar!/:?] at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:649) ~[aws-java-sdk-core-1.11.207.jar!/:?] at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:513) ~[aws-java-sdk-core-1.11.207.jar!/:?] at com.amazonaws.services.sqs.AmazonSQSClient.doInvoke(AmazonSQSClient.java:1740) ~[aws-java-sdk-sqs-1.11.207.jar!/:?] at com.amazonaws.services.sqs.AmazonSQSClient.invoke(AmazonSQSClient.java:1716) ~[aws-java-sdk-sqs-1.11.207.jar!/:?] at com.amazonaws.services.sqs.AmazonSQSClient.executeDeleteMessageBatch(AmazonSQSClient.java:873) ~[aws-java-sdk-sqs-1.11.207.jar!/:?] at com.amazonaws.services.sqs.AmazonSQSClient.deleteMessageBatch(AmazonSQSClient.java:849) ~[aws-java-sdk-sqs-1.11.207.jar!/:?] at com.amazon.sqs.javamessaging.AmazonSQSMessagingClientWrapper.deleteMessageBatch(AmazonSQSMessagingClientWrapper.java:168) [amazon-sqs-java-messaging-lib-1.0.3.jar!/:?] at com.amazon.sqs.javamessaging.acknowledge.RangedAcknowledger.action(RangedAcknowledger.java:142) [amazon-sqs-java-messaging-lib-1.0.3.jar!/:?] at com.amazon.sqs.javamessaging.acknowledge.BulkSQSOperation.bulkAction(BulkSQSOperation.java:61) [amazon-sqs-java-messaging-lib-1.0.3.jar!/:?] at com.amazon.sqs.javamessaging.acknowledge.RangedAcknowledger.acknowledge(RangedAcknowledger.java:66) [amazon-sqs-java-messaging-lib-1.0.3.jar!/:?] at com.amazon.sqs.javamessaging.message.SQSMessage.acknowledge(SQSMessage.java:920) [amazon-sqs-java-messaging-lib-1.0.3.jar!/:?] at org.springframework.jms.listener.AbstractMessageListenerContainer.commitIfNecessary(AbstractMessageListenerContainer.java:780) [spring-jms-5.3.18.jar!/:5.3.18] at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:680) [spring-jms-5.3.18.jar!/:5.3.18] at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:331) [spring-jms-5.3.18.jar!/:5.3.18] at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:270) [spring-jms-5.3.18.jar!/:5.3.18] at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1237) [spring-jms-5.3.18.jar!/:5.3.18] at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1227) [spring-jms-5.3.18.jar!/:5.3.18] at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1120) [spring-jms-5.3.18.jar!/:5.3.18] at java.lang.Thread.run(Thread.java:832) [?:?] Caused by: org.apache.http.conn.ConnectTimeoutException: Connect to localhost:3128 [/localhost] failed: Connect timed out at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:151) ~[httpclient-4.5.13.jar!/:4.5.13] at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:376) ~[httpclient-4.5.13.jar!/:4.5.13] at jdk.internal.reflect.GeneratedMethodAccessor75.invoke(Unknown Source) ~[?:?] at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?] at java.lang.reflect.Method.invoke(Method.java:564) ~[?:?] at com.amazonaws.http.conn.ClientConnectionManagerFactory$Handler.invoke(ClientConnectionManagerFactory.java:76) ~[aws-java-sdk-core-1.11.207.jar!/:?] at com.amazonaws.http.conn.$Proxy125.connect(Unknown Source) ~[?:?] at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:401) ~[httpclient-4.5.13.jar!/:4.5.13] at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236) ~[httpclient-4.5.13.jar!/:4.5.13] at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186) ~[httpclient-4.5.13.jar!/:4.5.13] at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185) ~[httpclient-4.5.13.jar!/:4.5.13] at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83) ~[httpclient-4.5.13.jar!/:4.5.13] at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56) ~[httpclient-4.5.13.jar!/:4.5.13] at com.amazonaws.http.apache.client.impl.SdkHttpClient.execute(SdkHttpClient.java:72) ~[aws-java-sdk-core-1.11.207.jar!/:?] at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1235) ~[aws-java-sdk-core-1.11.207.jar!/:?] at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1055) ~[aws-java-sdk-core-1.11.207.jar!/:?] ... 23 more Caused by: java.net.SocketTimeoutException: Connect timed out at sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:546) ~[?:?] at sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) ~[?:?] at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:333) ~[?:?] at java.net.Socket.connect(Socket.java:648) ~[?:?] at org.apache.http.conn.socket.PlainConnectionSocketFactory.connectSocket(PlainConnectionSocketFactory.java:75) ~[httpclient-4.5.13.jar!/:4.5.13] at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142) ~[httpclient-4.5.13.jar!/:4.5.13] at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:376) ~[httpclient-4.5.13.jar!/:4.5.13] at jdk.internal.reflect.GeneratedMethodAccessor75.invoke(Unknown Source) ~[?:?] at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?] at java.lang.reflect.Method.invoke(Method.java:564) ~[?:?] at com.amazonaws.http.conn.ClientConnectionManagerFactory$Handler.invoke(ClientConnectionManagerFactory.java:76) ~[aws-java-sdk-core-1.11.207.jar!/:?] at com.amazonaws.http.conn.$Proxy125.connect(Unknown Source) ~[?:?] at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:401) ~[httpclient-4.5.13.jar!/:4.5.13] at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236) ~[httpclient-4.5.13.jar!/:4.5.13] at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186) ~[httpclient-4.5.13.jar!/:4.5.13] at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185) ~[httpclient-4.5.13.jar!/:4.5.13] at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83) ~[httpclient-4.5.13.jar!/:4.5.13] at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56) ~[httpclient-4.5.13.jar!/:4.5.13] at com.amazonaws.http.apache.client.impl.SdkHttpClient.execute(SdkHttpClient.java:72) ~[aws-java-sdk-core-1.11.207.jar!/:?] at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1235) ~[aws-java-sdk-core-1.11.207.jar!/:?] at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1055) ~[aws-java-sdk-core-1.11.207.jar!/:?] ... 23 more
解决方法
1. 调整日志框架的异常栈输出配置
Spring Boot默认使用Logback,修改logback-spring.xml(或logback.xml)的编码器配置,让日志输出完整异常栈:
<configuration> <!-- 其他原有配置 --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <!-- %ex{full} 表示输出完整的异常栈,不截断重复内容 --> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n%ex{full}</pattern> </encoder> </appender> </configuration>
如果使用Log4j2,修改log4j2.xml的PatternLayout:
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n%ex{full}"/>
2. 关闭AWS SDK的异常栈截断
AWS SDK默认会对重复的异常栈进行截断,可通过系统属性禁用该行为:
- 启动应用时添加JVM参数:
-Daws.sdk.exception.chain.enabled=false - 或在代码初始化阶段设置:
System.setProperty("aws.sdk.exception.chain.enabled", "false");
3. 手动打印完整异常栈
如果不想修改全局配置,在try-catch块中手动输出完整栈信息:
try { // 执行SQS相关操作或其他业务代码 } catch (Exception e) { // 方式1:直接打印到控制台 e.printStackTrace(); // 方式2:通过日志框架输出(需确保日志框架配置正确) logger.error("操作失败", e); }
额外提示:从现有日志定位问题
其实从你提供的日志已经能明确问题根源:应用尝试通过localhost:3128端口的代理连接AWS SQS时超时。可以从以下方向排查:
- 检查是否误设置了
HTTP_PROXY/HTTPS_PROXY环境变量 - 确认本地3128端口是否有代理服务在运行
- 检查AWS SQS客户端配置,是否意外开启了代理
内容的提问来源于stack exchange,提问作者Alexandru DuDu
相关产品推荐
相关产品推荐

