当前位置: 首页 > news >正文

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

背景

随着调用量增大,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);}

总结

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


http://www.mrgr.cn/news/71156.html

相关文章:

  • Autosar CP 基于CAN的时间同步规范导读
  • AlphaFold3中文安装教程
  • Chromium 中chrome.system.display扩展接口定义c++
  • 源码解析-Spring Eureka
  • CSMA/CD和CSMA/CA
  • goframe开发一个企业网站 rabbitmq队例15
  • ubuntu系统没有/var/log/messages日志文件解决方法
  • vue2和vue3的原理上的区别
  • 马尔科夫链蒙特卡罗 MCMC
  • java对接微信公众号API,实现扫码关注公众号,触发多条消息回复
  • 丹摩征文活动 | 丹摩智算:大数据治理的智慧引擎与实践探索
  • UE4 Cook 从UAT传递参数给UE4Editor
  • 【使用firebase crashlytics对c层代码进行字符上传】
  • 【3D Slicer】的小白入门使用指南一
  • leetcode day10 动态规划篇 64+139
  • 初识ElasticSearch
  • AI技术助力电商转型:从挑战到未来
  • 想自己做大模型备案的企业看过来【评估测试题+备案源文件】
  • 基于C#WinForm+DevExpress项目开发实战(九)
  • Python网络爬虫简介
  • 【AI】AI如何赋能软件开发流程
  • 软考知识备忘
  • 微服务容器化部署实践(FontConfiguration.getVersion)
  • 【大模型推理】KV缓冲
  • ORM框架-SQL Sugar第一集
  • 【回文日期——模拟】