背景
随着调用量增大,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);
}
总结
通过注解控制是否可以输出日志,比较方便快捷。
2123

被折叠的 条评论
为什么被折叠?



