通过注解控制是否打印日志
背景
随着调用量增大,es日志越来越多,为了减少日志输出,降低成本需要减少查询类日志的输出。
常见方案
方案一
只输出入参,不输出返回值。
比如添加注解ignoreLogResponse
方案二
入参出参都不输出。
比如添加注解ignoreLog
代码示例
这里以入参出参都不输出为例。
为了精细化控制日志输出,此处通过配置文件控制是否不输出日志,那个环境不输出日志。
添加配置文件
ignore-log-config:status: trueprofilesList:- 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 {@AutowiredIgnoreLogConfig 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")@IgnoreLogpublic BaseResponse<OrderInfoResp> queryOrderByOrderId(@RequestBody @Valid QueryOrderByOrderIdReq req){return orderInfoService.queryOrderByOrderId(req);}
总结
通过注解控制是否可以输出日志,比较方便快捷。