背景

项目接入微信小程序消息,不想一个一个接入微信的api,找了个用微信api封装的sdk, https://github.com/Wechat-Group/WxJava, 但这个sdk在处理异常时, 自己先log了异常,然后再抛出异常。

  1. 有的异常我们在业务层是处理过的(比如给用户推送提醒消息,用户拒收了,调用微信接口时微信返回了异常)
  2. 这些异常业务层已经处理过了, 但是这个sdk仍然 log 了error
  3. 我们系统有根据error异常数告警,这些异常经常误触发告警,造成干扰
<dependency>
    <groupId>com.github.binarywang</groupId>
    <artifactId>weixin-java-miniapp</artifactId>
    <version>4.1.9.B</version>
</dependency>

处理方法

这个sdk的异常处理方式有些不合适, 但是也没法快速修改它的代码,需要想办法绕过

  1. 排查代码发现它的log 是通过 sl4j 写入的,我们项目采用的是 log4j2 (就是21年底那个疯狂RCE漏洞的log lib😅)
package cn.binarywang.wx.miniapp.api.impl;
@Slf4j
public abstract class BaseWxMaServiceImpl<H, P> implements WxMaService, RequestHttp<H, P> {
private <T, E> T executeInternal(RequestExecutor<T, E> executor, 
    String uri, E data, boolean doNotAutoRefreshToken) throws WxErrorException {
    // 省略....
    try {
      T result = executor.execute(uriWithAccessToken, data, WxType.MiniApp);
      log.debug("\n【请求地址】: {}\n【请求参数】:{}\n【响应数据】:{}", uriWithAccessToken, dataForLog, result);
      return result;
    } catch (WxErrorException e) {
      if (error.getErrorCode() != 0) {
        log.error("\n【请求地址】: {}\n【请求参数】:{}\n【错误信息】:{}", uriWithAccessToken, dataForLog, error);
        throw new WxErrorException(error, e);
      }
      return null;
    } catch (IOException e) {
      log.error("\n【请求地址】: {}\n【请求参数】:{}\n【异常信息】:{}", uriWithAccessToken, dataForLog, e.getMessage());
      throw new WxRuntimeException(e);
    }
  }
}
  1. 查看 log4j 的文档, 发现可以通过 filter 来过滤log, 修改 log4j2.xml 配置
<Loggers>
    <Logger name="cn.binarywang.wx.miniapp.api.impl.BaseWxMaServiceImpl" level="info" additivity="false">
        <StringMatchFilter text="请求地址" onMatch="DENY" onMismatch="ACCEPT"/>
        <AppenderRef ref="File"/>
    </Logger>
    <Root level="info">
        <AppenderRef ref="File"/>
    </Root>
</Loggers>

参考:

  • https://logging.apache.org/log4j/2.x/manual/architecture.html
  • https://logging.apache.org/log4j/2.x/manual/configuration.html
  • https://logging.apache.org/log4j/2.x/manual/customloglevels.html
  • https://logging.apache.org/log4j/log4j-2.2/manual/filters.html#RegexFilter
  • https://www.docs4dev.com/docs/zh/log4j2/2.x/all/manual-filters.html#RegexFilter
  • https://blog.csdn.net/justry_deng/article/details/109413153 (官网文档里并没有介绍所有内置的filter,这里有介绍)