WSO2 API Manager 3.1.0中Tomcat访问日志无法获取请求耗时问题求助
解决WSO2 APIM 3.1.0中Tomcat访问日志%T/%D格式符不生效的问题
我之前在WSO2 APIM 3.1.0里遇到过一模一样的问题!当时折腾了好一阵才找到原因和解决办法,分享给你:
问题根源
WSO2 APIM对Tomcat的访问日志配置做了一层封装处理,默认的access-log.properties文件中的%T/%D格式符会因为APIM的请求处理链路(比如网关拦截器、消息 mediation 流程)的特殊逻辑,导致无法正确捕获耗时参数,进而出现显示破折号或MIME类型的异常情况。
可行的解决/替代方案
方案1:使用APIM网关日志直接获取耗时(推荐)
APIM自身的网关日志已经内置了请求耗时的统计,不需要依赖Tomcat的访问日志,配置起来更简单可靠:
- 打开
<APIM_HOME>/repository/conf/log4j2.properties文件,找到logger.GATEWAY_LOG对应的appender配置 - 在日志布局的
pattern中添加%X{ELAPSED_TIME}字段,这是APIM在请求处理完成后自动记录的毫秒级耗时 - 示例配置片段:
appender.GATEWAY_LOG.layout.pattern = [%d{ISO8601}] %5p {%c} - API: %X{apiName} | Resource: %X{resourcePath} | Elapsed Time: %X{ELAPSED_TIME}ms | %m%n - 重启APIM后,网关日志(默认路径:
<APIM_HOME>/repository/logs/gateway.log)中就能看到每条请求的具体耗时,还能关联到对应的API和资源路径,排查问题更方便。
方案2:直接修改Tomcat的AccessLogValve配置
如果你一定要用Tomcat访问日志来统计耗时,可以绕开APIM的access-log.properties,直接修改Tomcat的核心配置:
- 打开
<APIM_HOME>/repository/conf/tomcat/catalina-server.xml文件,找到AccessLogValve的配置块(如果没有可以新增) - 直接在
pattern属性中加入%D(微秒级耗时)或%T(秒级耗时)格式符 - 示例配置片段:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="${carbon.home}/repository/logs" prefix="tomcat_access_" suffix=".log" pattern="%h %l %u %t "%r" %s %b %D" /> - 修改完成后重启APIM,Tomcat会直接解析这些格式符,就能正确记录请求耗时了。
方案3:排查自定义组件的干扰
如果你的APIM环境中添加了自定义的请求拦截器、 mediation 脚本或扩展组件,可能会干扰Tomcat的耗时统计逻辑:
- 暂时禁用所有自定义组件,重启APIM测试日志是否正常显示耗时
- 如果恢复正常,再逐个启用组件排查,定位到具体的干扰项后调整其逻辑。
内容的提问来源于stack exchange,提问作者Kybernetes
相关产品推荐
相关产品推荐

