SOAP服务日志未写入指定文件,请求/响应日志缺失求助
问题分析与解决方案
咱们先拆解下你当前配置里可能导致SOAP请求/响应没被记录的几个关键点:
1. 自定义PatternLayout缺少输出格式配置
你用了common.log.PatternLayout这个自定义布局,但没指定ConversionPattern参数——Spring WS的MessageTracing日志是携带SOAP消息内容的,如果布局里没包含%m(消息主体)这类占位符,就算日志触发了,也看不到SOAP数据。
建议先换成标准的Apache PatternLayout测试,或者给自定义布局补上格式配置:
<layout class="common.log.PatternLayout"> <param name="ConversionPattern" value="%d{ISO8601} [%t] %-5p %c - %m%n"/> </layout>
%m会把日志消息(也就是SOAP请求/响应的XML内容)输出到文件里,这是核心项。
2. Spring WS日志记录器的粒度不够
Spring WS的消息追踪有更细分的日志器,你当前只配置了顶层的MessageTracing,可能无法捕获完整的请求/响应细节。建议补充更细粒度的日志配置:
<!-- 服务端:捕获接收的请求和发送的响应 --> <logger name="org.springframework.ws.server.MessageTracing" additivity="false"> <level value='TRACE'/> <appender-ref ref="WS_REQUEST_LOG" /> </logger> <logger name="org.springframework.ws.server.MessageTracing.received" additivity="false"> <level value='TRACE'/> <appender-ref ref="WS_REQUEST_LOG" /> </logger> <logger name="org.springframework.ws.server.MessageTracing.sent" additivity="false"> <level value='TRACE'/> <appender-ref ref="WS_REQUEST_LOG" /> </logger> <!-- 客户端:捕获发送的请求和接收的响应 --> <logger name="org.springframework.ws.client.MessageTracing" additivity="false"> <level value='TRACE' /> <appender-ref ref="WS_REQUEST_LOG" /> </logger> <logger name="org.springframework.ws.client.MessageTracing.sent" additivity="false"> <level value='TRACE' /> <appender-ref ref="WS_REQUEST_LOG" /> </logger> <logger name="org.springframework.ws.client.MessageTracing.received" additivity="false"> <level value='TRACE' /> <appender-ref ref="WS_REQUEST_LOG" /> </logger>
3. 额外检查项
- 全局日志级别压制:看看log4j.xml里的
<root>节点级别,如果设置为ERROR或高于TRACE的级别,可能会间接影响子日志器(虽然你设了additivity="false",但还是确认下更稳妥)。 - 日志路径有效性:
${log4j.ws-req}变量是否正确解析?可以临时换成绝对路径(比如value="/tmp/ws-requests.log"),测试文件是否生成、是否有写入权限。 - Spring WS版本匹配:如果是较新的Spring WS版本,确认日志器名称有没有变更(不过
MessageTracing系列是长期稳定的)。
测试流程
- 先补全PatternLayout的
ConversionPattern,重启服务发起SOAP请求,查看日志文件。 - 如果还是没内容,添加细分的MessageTracing子日志器。
- 验证日志路径的可写性,排除文件权限问题。
内容的提问来源于stack exchange,提问作者lank81
相关产品推荐
相关产品推荐

