如何配置org.apache.http.wire隐藏JWT token?Karate日志掩码问题
解决Karate中org.apache.http.wire日志泄露JWT Token的问题
降低日志级别(最简便方案)
直接将org.apache.http.wire的日志级别调整为WARN或ERROR,停止输出详细的请求/响应报文。根据你使用的日志框架,修改对应配置文件:- Logback配置(
logback.xml):<logger name="org.apache.http.wire" level="WARN"/> - Log4j2配置(
log4j2.xml):<Logger name="org.apache.http.wire" level="WARN"/>
- Logback配置(
自定义HttpClient连接操作器(保留日志但掩码敏感内容)
如果你需要保留wire日志但过滤JWT Token,可以通过自定义HttpClient配置实现日志内容替换:- 编写Java类继承
HttpClientConfig,重写配置方法替换日志逻辑:import com.intuit.karate.http.HttpClientConfig; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.conn.DefaultHttpClientConnectionOperator; import org.apache.http.impl.conn.LoggingHttpClientConnectionOperator; import org.apache.http.conn.DnsResolver; import org.apache.http.impl.conn.PoolingHttpClientConnectionManagerFactory; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; public class MaskedWireLogConfig extends HttpClientConfig { @Override public HttpClientBuilder configure(HttpClientBuilder builder) { DnsResolver resolver = getDnsResolver(); DefaultHttpClientConnectionOperator connectionOperator = new DefaultHttpClientConnectionOperator(resolver); LoggingHttpClientConnectionOperator loggingOperator = new LoggingHttpClientConnectionOperator(connectionOperator, getLogger()) { @Override protected void log(String s) { // 匹配JWT Token格式并替换为掩码内容 String maskedLog = s.replaceAll("Bearer\\s+[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+", "Bearer ***MASKED***"); super.log(maskedLog); } }; builder.setConnectionManagerFactory(new PoolingHttpClientConnectionManagerFactory() { @Override public PoolingHttpClientConnectionManager create(HttpClientConfig config) { PoolingHttpClientConnectionManager cm = super.create(config); cm.setConnectionOperator(loggingOperator); return cm; } }); return builder; } } - 在
karate-config.js中引用该自定义配置:function fn() { var config = { httpClientConfig: Java.type('com.your.package.MaskedWireLogConfig') }; return config; }
- 编写Java类继承
使用Karate内置日志修改器(Karate 1.3.0+支持)
利用Karate提供的logModifier配置全局处理日志输出,针对org.apache.http.wire的日志进行掩码:function fn() { karate.configure('logModifier', function(log) { if (log.loggerName === 'org.apache.http.wire') { // 替换JWT Token为掩码 return log.message.replaceAll("Bearer\\s+[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+", "Bearer ***MASKED***"); } return log.message; }); return {}; }
内容的提问来源于stack exchange,提问作者Tony Thongsinthop
相关产品推荐
相关产品推荐

