如何在Tomcat中运行的Spring Boot应用中查看SOAP调用日志
嘿,我来帮你搞定这个问题!你之前在Spring Boot主方法里加的那两个系统属性,在Jar包运行时没问题,但部署成WAR到Tomcat后,因为Tomcat的启动机制不一样,主方法可能不会被触发,所以得换几种方式来配置:
方法1:通过Tomcat启动脚本添加JVM参数
这是全局生效的方式,适合所有部署在这个Tomcat上的应用(如果只有你的应用需要SOAP日志的话也没问题):
- Linux/macOS:找到Tomcat的
bin/catalina.sh文件,在文件开头或者JAVA_OPTS相关的配置段添加:JAVA_OPTS="$JAVA_OPTS -Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true -Dcom.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump=true" - Windows:编辑
bin/catalina.bat,找到类似set JAVA_OPTS=的行,修改成:set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true -Dcom.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump=true
修改后重启Tomcat,SOAP请求和响应的日志就会输出到Tomcat的logs/catalina.out里。
方法2:在Spring Boot应用内部配置(仅当前应用生效)
如果不想影响Tomcat上的其他应用,可以在Spring Boot里用初始化逻辑来设置这些属性,代替主方法里的代码:
创建一个配置类,利用@PostConstruct在Spring容器初始化时设置系统属性:
import javax.annotation.PostConstruct; import org.springframework.context.annotation.Configuration; @Configuration public class SoapLoggingConfig { @PostConstruct public void enableSoapLogging() { System.setProperty("com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump", "true"); System.setProperty("com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump", "true"); } }
这样不管是Jar还是WAR部署,只要Spring容器启动,这些属性就会被设置,日志会输出到你应用的日志文件或者Tomcat的catalina.out里(取决于你的日志配置)。
方法3:通过日志框架捕获SOAP日志(更灵活)
如果你用的是Logback或者Log4j2,还可以直接配置日志框架来打印SOAP相关的DEBUG日志,这样能更好地控制日志输出的位置和格式:
比如Logback的logback-spring.xml里添加:
<logger name="com.sun.xml.ws.transport.http.client.HttpTransportPipe" level="DEBUG" additivity="false"> <appender-ref ref="YOUR_APPENDER"/> <!-- 替换成你定义的日志输出appender --> </logger> <logger name="com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe" level="DEBUG" additivity="false"> <appender-ref ref="YOUR_APPENDER"/> </logger>
这样SOAP的详细日志就会输出到你指定的日志文件里,方便单独查看。
小提示
你设置的两个属性分别对应JAX-WS RI的独立版本(com.sun.xml.ws)和JDK内置的JAX-WS版本(com.sun.xml.internal.ws),同时配置能覆盖所有可能的情况,确保不管你的应用用的是哪个版本的JAX-WS都能输出日志。
内容的提问来源于stack exchange,提问作者Muhannad A.Alhariri

