You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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"/>
      
  • 自定义HttpClient连接操作器(保留日志但掩码敏感内容)
    如果你需要保留wire日志但过滤JWT Token,可以通过自定义HttpClient配置实现日志内容替换:

    1. 编写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;
          }
      }
      
    2. 在karate-config.js中引用该自定义配置:
      function fn() {
          var config = {
              httpClientConfig: Java.type('com.your.package.MaskedWireLogConfig')
          };
          return config;
      }
      
  • 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 12:27:13