选优化代码的方向,方法入参和返回结果日志首当其冲,每个方法都会有这两个日志,一大堆冗余的代码,而且什么样的打印格式都有,非常的杂乱。

`public OrderDTO getOrder(OrderVO orderVO, String name) {

log.info("订单详情入参:orderVO={},name={}", JSON.toJSONString(orderVO), name);OrderDTO orderInfo = orderService.getOrderInfo(orderVO);log.info("订单详情结果:orderInfo={}", JSON.toJSONString(orderInfo));return orderInfo;

}
`

下边我们利用 AOP 实现请求方法的入参、返回结果日志统一打印,避免日志打印格式杂乱,同时减少业务代码量。

一、自定义注解
自定义切面注解 @PrintlnLog 用来输出日志,注解权限 @Target({ElementType.METHOD}) 限制只在方法上使用,注解中只有一个参数 description ,用来自定义方法输出日志的描述。

`@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Documented
public @interface PrintlnLog {

/**

  • 自定义日志描述信息文案
  • @return
    */
    String description() default “”;
    }
    `

二、切面类
接下来编写 @PrintlnLog 注解对应的切面实现,doBefore()中输出方法的自定义描述、入参、请求方式、请求 url、被调用方法的位置等信息,doAround() 中打印方法返回结果。

注意: 如何想指定切面在哪个环境执行,可以用 @Profile 注解,只打印某个环境的日志。

`@Slf4j
@Aspect
@Component
//@Profile ({“dev”}) // 只对某个环境打印日志
public class LogAspect {

private static final String LINE_SEPARATOR = System.lineSeparator();

/**

  • 以自定义 @PrintlnLog 注解作为切面入口
    */
    @Pointcut("@annotation(com.chengxy.unifiedlog.config.PrintlnLog)")
    public void PrintlnLog() {
    }

/**

  • @param joinPoint

  • @author fu

  • @description 切面方法入参日志打印

  • @date 2020/7/15 10:30
    */
    @Before(“PrintlnLog()”)
    public void doBefore(JoinPoint joinPoint) throws Throwable {

    ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    HttpServletRequest request = attributes.getRequest();

    String methodDetailDescription = this.getAspectMethodLogDescJP(joinPoint);

    log.info("------------------------------- start --------------------------");
    /**

    • 打印自定义方法描述
      /
      log.info(“Method detail Description: {}”, methodDetailDescription);
      /
      *
    • 打印请求入参
      /
      log.info(“Request Args: {}”, JSON.toJSONString(joinPoint.getArgs()));
      /
      *
    • 打印请求方式
      /
      log.info(“Request method: {}”, request.getMethod());
      /
      *
    • 打印请求 url
      */
      log.info(“Request URL: {}”, request.getRequestURL().toString());

    /**

    • 打印调用方法全路径以及执行方法
      */
      log.info(“Request Class and Method: {}.{}”, joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName());
      }

/**

  • @param proceedingJoinPoint

  • @author xiaofu

  • @description 切面方法返回结果日志打印

  • @date 2020/7/15 10:32
    */
    @Around(“PrintlnLog()”)
    public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {

    String aspectMethodLogDescPJ = getAspectMethodLogDescPJ(proceedingJoinPoint);

    long startTime = System.currentTimeMillis();

    Object result = proceedingJoinPoint.proceed();
    /**

    • 输出结果
      */
      log.info("{},Response result : {}", aspectMethodLogDescPJ, JSON.toJSONString(result));

    /**

    • 方法执行耗时
      */
      log.info(“Time Consuming: {} ms”, System.currentTimeMillis() - startTime);

    return result;
    }

/**

  • @author xiaofu
  • @description 切面方法执行后执行
  • @date 2020/7/15 10:31
    */
    @After(“PrintlnLog()”)
    public void doAfter(JoinPoint joinPoint) throws Throwable {
    log.info("------------------------------- End --------------------------" + LINE_SEPARATOR);
    }

/**

  • @param joinPoint
  • @author xiaofu
  • @description @PrintlnLog 注解作用的切面方法详细细信息
  • @date 2020/7/15 10:34
    */
    public String getAspectMethodLogDescJP(JoinPoint joinPoint) throws Exception {
    String targetName = joinPoint.getTarget().getClass().getName();
    String methodName = joinPoint.getSignature().getName();
    Object[] arguments = joinPoint.getArgs();
    return getAspectMethodLogDesc(targetName, methodName, arguments);
    }

/**

  • @param proceedingJoinPoint
  • @author xiaofu
  • @description @PrintlnLog 注解作用的切面方法详细细信息
  • @date 2020/7/15 10:34
    */
    public String getAspectMethodLogDescPJ(ProceedingJoinPoint proceedingJoinPoint) throws Exception {
    String targetName = proceedingJoinPoint.getTarget().getClass().getName();
    String methodName = proceedingJoinPoint.getSignature().getName();
    Object[] arguments = proceedingJoinPoint.getArgs();
    return getAspectMethodLogDesc(targetName, methodName, arguments);
    }

/**

  • @param targetName
  • @param methodName
  • @param arguments
  • @author xiaofu
  • @description 自定义注解参数
  • @date 2020/7/15 11:51
    */
    public String getAspectMethodLogDesc(String targetName, String methodName, Object[] arguments) throws Exception {
    Class targetClass = Class.forName(targetName);
    Method[] methods = targetClass.getMethods();
    StringBuilder description = new StringBuilder("");
    for (Method method : methods) {
    if (method.getName().equals(methodName)) {
    Class[] clazzs = method.getParameterTypes();
    if (clazzs.length == arguments.length) {
    description.append(method.getAnnotation(PrintlnLog.class).description());
    break;
    }
    }
    }
    return description.toString();
    }
    }
    `

三、应用
我们在需要打印入参和返回结果日志的方法,加上 @PrintlnLog 注解,并添加自定义方法描述。

`@RestController
@RequestMapping
public class OrderController {

@Autowired
private OrderService orderService;

@PrintlnLog(description = “订单详情Controller”)
@RequestMapping("/order")
public OrderDTO getOrder(OrderVO orderVO, String name) {

OrderDTO orderInfo = orderService.getOrderInfo(orderVO);return orderInfo;

}
}
`

代码里去掉 log.info 日志打印,加上 @PrintlnLog 看一下效果,清晰明了。

Demo GitHub 地址:github.com/chengxy-nds/Springboot-…

————————————————
原文作者:chengxy-nds
转自链接:https://learnku.com/articles/47427
版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。

Log - Log日志入参相关推荐

  1. java项目统一打印入参出参等日志

    java项目统一打印入参出参等日志 1.背景 2.设计思路 3.核心代码 3.1 自定义注解 3.2 实现BeanFactoryPostProcessor接口 3.3 实现MethodIntercep ...

  2. SpringBoot利用Aop打印入参出参日志

    SpringBoot利用Aop打印入参出参日志 前言 以前写代码不会用Aop的时候,记录入参出参的日志打印都是在Controller中完成的,每个Controller的方法开始之前先打印个日志,然后方 ...

  3. 运用aop做日志,实现请求方法的入参、返回结果日志统一打印,避免日志打印格式杂乱,同时减少重复代码

    文章目录 一.自定义注解 二.切面类 三.应用 一.自定义注解 自定义切面注解@PrintlnLog 用来输出日志,注解权限 @Target({ElementType.METHOD}) 限制只在方法上 ...

  4. redo log重做日志缓冲

    ---------------------------------- 2015-02-10---------------------------------- innodb redo log (重做日 ...

  5. linux下ftp命令输出日志,ftp中/var/log/xferlog日志解析及ftp常用命令常用

    在vsftpd.conf中有如下内容定义了日志的记录方式: ##表明FTP服务器记录上传下载的情况 xferlog_enable=YES ##表明将记录的上传下载情况写在xferlog_file所指定 ...

  6. android tag 快捷_Android Studio快捷键生成TAG、Log.x日志输出介绍

    生成TAG logt+Tab键: private static final String TAG = "Extract"; 生成Log.d() logd+Tab键: Log.d(T ...

  7. android tag定义快捷键,Android Studio快捷键生成TAG、Log.x日志输出介绍

    生成TAG logt+Tab键: private static final String TAG = "Extract"; 生成Log.d() logd+Tab键: Log.d(T ...

  8. MySQL redo log 重做日志 原理 Oracle Redo Log 机制 小结

    MySQL-重做日志 redo log -原理 [redo log buffer][redo log file]-原理 目录: 1.重做日志写入过程图 2.相关知识点汇总图 3.redo_log_bu ...

  9. 误删除DAMENG01.log怎么办/ 日志文件出现问题咋办?

    误删除DAMENG01.log怎么办/ 日志文件出现问题咋办? 1. 如果有备份文件,可以重新初始化一个库(初始化参数要和原库一样,比如页大小.大小写敏感.字符集等,这些可以在达梦数据目录DAMENG ...

最新文章

  1. 你不懂的JS学习笔记(作用域和闭包)
  2. Microsoft 用户体验虚拟化 UE-V 1.0 RC 发布
  3. 如何验证 MySQL 的 InnoDB 在可重复读下依然会有幻影行问题及其原因
  4. TensorFlow学习笔记(十九) 基本算术运算和Reduction归约计算
  5. 软件工程--第五章-- 总体设计
  6. 简单的ftp服务器(客户端、服务器端、socket)
  7. js删除mysql记录_(DELETEUPDATE)修改、删除数据记录_MySQL
  8. bind简单转发实验
  9. Android系统下内存使用情况与监测
  10. 牛客16426 玩具谜题
  11. 编写一个脚本判断某个用户是否处在活动模式_使用 TypeScript 编写爬虫
  12. 20175333曹雅坤实验四《Android程序设计》实验报告
  13. hdu4561 bjfu1270 最大子段积
  14. Linux的链接工具 putty 以及一些命令。
  15. Spring 传播方式
  16. 字典哈希表的实现原理
  17. charCode与keyCode的区别
  18. mysql 按类型查询个数和总数
  19. 获取RenderedGeometry不对的处理
  20. 机器人把大龙拉出来_英雄联盟之我的电竞梦

热门文章

  1. 深入理解Java虚拟机——JVM垃圾回收机制和垃圾收集器详解
  2. 组策略添加受信任站点
  3. 微信公众号广告后台接口开发
  4. 【Python入门教程】教你如何10分钟入门Python!(超详细)
  5. 高斯输出文件批量提取单点能:Shell脚本处理
  6. 【CV】SiamFC:用于目标跟踪的全卷积孪生网络
  7. 开票软件打印时,没有预览界面
  8. QT调用STK12(STKX模块)
  9. git-crypt 在 windows中解密过程步骤
  10. 【原创】 ES5高效封装WIN10系统教程2020系列(五)常用软件安装及设置