【bug】 -- Push项目的log优化RecordNotExistException()

现象:

日常维护系统过程中,发现log中经常出现因RecordNotExistException()打印出的stacktrace,并没有出现业务上的问题,但是容易混淆视线,而且占用内存。组长就让排查下这个log存在的意义,是否是业务上的正常case。以进行后续的优化。

【bug】 -- Push项目的log优化RecordNotExistException()_第1张图片

排查:

经查发现,这是我们自定义的一个异常类,当时是前同事负责此处逻辑处理。可能当时就是为了打印此处异常stacktrace。但是现在感觉日志级别有些高,没有必要。于是决定不再输出stacktrace,减少内存占用和视线混淆。

处理:

发生此异常的位置以及抛出异常的方法。

【bug】 -- Push项目的log优化RecordNotExistException()_第2张图片

【bug】 -- Push项目的log优化RecordNotExistException()_第3张图片

发现异常捕获是在外边,而且不单纯是为了捕获getByUUIDAndApp的异常,还有可能存在其他方法等的其他异常信息,比如NullPointerException,ClassNotFoundException等RuntimeException,所以也不能说为了不抛RecordNotExistException()就直接将

logger.error("发生了异常,{}",e);

修改成

logger.warn("RecordNotExistException : ",e.getMessage());

所以解决方案如下,有两种,(优选方案一):

方案一:将本次打印无意义stacktrace的自定义异常类RecordNotExistException()另行处理,其他异常依然按原有方式进行处理。

        @Override
        public void onException (Exception e){
            if (e instanceof RecordNotExistException) {
                logger.warn("RecordNotExistException : ", e.getMessage());
            } else {
                logger.error("发生了异常,{}", e);
            }
        }

方案二:在原始调用getByUUIDAndApp的方法call()中捕获到异常后,不抛出即可。

        try {
            deviceUserEntity = DeviceTokenBiz.this.deviceBiz.getByUUIDAndApp(oldDeviceUUID, appId);
        } catch (RecordNotExistException e) {

        }

题外话:

为什么不直接在getByUUIDAndApp直接使用log.warn呢?因为这个方法很可能被的类或工程引用,能不改尽量还是不改的。虽然修改之后对当前项目没有其他影响。

【bug】 -- Push项目的log优化RecordNotExistException()_第4张图片

补充:

 异常信息打印的不同效果。各取所需。

【bug】 -- Push项目的log优化RecordNotExistException()_第5张图片

你可能感兴趣的:(☛项目实战)