通过注解控制是否打印日志

背景

随着调用量增大,es日志越来越多,为了减少日志输出,降低成本需要减少查询类日志的输出。

常见方案

方案一

只输出入参,不输出返回值。

比如添加注解ignoreLogResponse

方案二

入参出参都不输出。

比如添加注解ignoreLog

代码示例

这里以入参出参都不输出为例。

为了精细化控制日志输出,此处通过配置文件控制是否不输出日志,那个环境不输出日志。

添加配置文件

ignore-log-config:
  status: true
  profilesList:
    - pro

添加配置类

@ConfigurationProperties(prefix = "ignore-log-config")
@Configuration
@Data
@RefreshScope
public class IgnoreLogConfig {
    @Value("${spring.profiles.active}")
    String active;

    private boolean status = false;
    private List<String> profilesList = new ArrayList<>();
    public boolean ignoreLog(){
        if(status==true&&profilesList.contains(active)){
            return true;
        }
        return false;
    }
}

添加注解

/**
 * 屏蔽日志输出
 */
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface IgnoreLog {
}

修改日志切面

日志切面要根据自己的业务具体编写,这里只是示例

init doTask 和 finishTask要自己实现

@Aspect
@Component
public class OrderLogAspect extends LogAspect {

    @Autowired
    IgnoreLogConfig ignoreLogConfig;

    /**
     * 1) execution(): 表达式主体
     * 2) 第一个public *号:表示返回类型, *号表示所有的类型。
     * 3) 包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包。
     * 4) 第二个*号:表示类名,*号表示所有的类。
     * 5) *(..):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数
     */
    @Pointcut("execution(public * com.sky.controller..*.*(..))")
    public void pointCutMethod() {
    }

    @Before("pointCutMethod()")
    public void doBefore(JoinPoint joinPoint) {
        init(joinPoint);
    }

    @Around("pointCutMethod()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        return doTask(joinPoint);
    }

    @AfterReturning(returning = "ret", pointcut = "pointCutMethod()")
    public void doAfterReturning(JoinPoint joinPoint, Object ret) {
        //如果有忽略日志注解,则不打印日志
        if(ignoreLogConfig.ignoreLog()){
            MethodSignature methodSignature = (MethodSignature)joinPoint.getSignature();
            IgnoreLog ignoreLog = (IgnoreLog)methodSignature.getMethod().getAnnotation(IgnoreLog.class);
            if (ignoreLog != null) {
                return;
            }
        }
        finishTask(ret, joinPoint);
    }
}

在不需要输出日志的接口上添加注解

    @ApiOperation(value = "根据orderId获取orderInfo", notes = "根据orderId获取orderInfo", httpMethod = "POST")
    @PostMapping(value = "/queryOrderByOrderId")
    @IgnoreLog
    public BaseResponse<OrderInfoResp> queryOrderByOrderId(@RequestBody @Valid QueryOrderByOrderIdReq req){
        return orderInfoService.queryOrderByOrderId(req);
    }

总结

通过注解控制是否可以输出日志,比较方便快捷。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值