参考
- 搜索关键字:spring controller 打印
- SpringBoot项目日志打印请求参数及返回参数_主要参考
- 使用springMVC AOP实现日记记录_springmvc下配置
- 注解@Slf4j的使用 - 简书 (jianshu.com)
- 利用Jackson封装常用JsonUtil工具类_mengqingming1的博客-CSDN博客_jackson 通用工具类
思路:
自定义注解,针对注解创建切面,对Controller 中的方法使用注解,通过切面中的 @Before, @Around 获取数据并打印
实现步骤
日志打印 pom.xml 依赖
<!-- spring-aop -->
<spring.version>4.3.12.RELEASE</spring.version>
<!-- jackson-databind, jackson-core, jackson-annotations -->
<jackson.version>2.9.1</jackson.version>
<!-- aspectjrt, aspectjweaver 实现切面 -->
<aspectj.version>1.8.9</aspectj.version>
<!-- logback-core 会自动引入依赖的 sjf4j -->
<logback.version>1.2.2</logback.version>
<!-- lombok sjf4j 中 log 对象实例化-->
<lombok.version>1.16.18</lombok.version>
spring-mvc.xml 添加 aop 自动代理 <aop:aspectj-autoproxy/>
新建注解 LogPrint,将注解作为切点,作用到 Controller 的方法
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogPrint {
String description() default "";
}
新建切面 LogPrintAspect,在 controller 方法调用前,调用后打印入参,出参
@Aspect
@Component
@Slf4j
public class LogPrintAspect {
// 1,声明切点
@Pointcut("@annotation(cn.exrick.common.annotaion.LogPrint)")
public void logPrint(){}
// 2,打印入参 joinPoint.getArgs() -- 获取入参
@Before("logPrint()")
public void doBefore(JoinPoint joinPoint){
// 3, 打印出参 proceedingJoinPoint.proceeding() -- 执行切点修饰的方法,拿到结果,打印响应
@Around("logPrint()")
public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {}
// 4,切点作用的方法结束
@After("logPrint()")
public void doAfter(){}
}
使用注解 @LogPrint
修饰 Controller 类中的方法
@RestController
public class LogController {
@LogPrint
@RequestMapping("/logGet")
public Object getTest(String name, String age){
String content = name + "今年" + age + "岁";
HashMap<String, Object> resultMap = new HashMap<>();
resultMap.put("content", content);
return resultMap;
}
}
日志打印结果
过程记录
日志打印存在的问题:打印请求与打印响应并不是相邻输出,查看日志的时候需要添加上过滤条件
jackson 直接返回带中文的字符串,中文显示乱码 ????18?
。将字符串放到HashMap 中返回,中文正常显示{"content": "张三今年18岁"}
@LogPrint 注解加上后日志不打印?<aop:aspectj-autoproxy/>
没有添加导致 aop 在 spring 框架中不启用
日志打印简化版本,日志过滤
添加
<!-- aop 配置批量添加切面 -->
<aop:config>
<aop:advisor advice-ref="txAdvice"
pointcut="execution(* cn.exrick.manager.service..*.*(..))" />
</aop:config>
todo
- 注解的实现
- jsonUtil 的实现
- jackson post 请求拿不到数据(使用 postman模拟请求前提下)
- 根据日志id,过滤日志,在 linux 中怎样进行过滤