Log4j2 Filter
背景
项目接入微信小程序消息,不想一个一个接入微信的api,找了个用微信api封装的sdk, https://github.com/Wechat-Group/WxJava, 但这个sdk在处理异常时, 自己先log了异常,然后再抛出异常。
- 有的异常我们在业务层是处理过的(比如给用户推送提醒消息,用户拒收了,调用微信接口时微信返回了异常)
- 这些异常业务层已经处理过了, 但是这个sdk仍然 log 了error
- 我们系统有根据error异常数告警,这些异常经常误触发告警,造成干扰
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>4.1.9.B</version>
</dependency>
处理方法
这个sdk的异常处理方式有些不合适, 但是也没法快速修改它的代码,需要想办法绕过
- 排查代码发现它的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);
}
}
}
- 查看 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,这里有介绍)