# logprint **Repository Path**: springff/logprint ## Basic Information - **Project Name**: logprint - **Description**: spring controller 日志输出 json 格式请求参数+响应体 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-08-31 - **Last Updated**: 2021-08-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # **Spring Controller 打印入参/出参** ## 参考 - 搜索关键字:spring controller 打印 - [SpringBoot项目日志打印请求参数及返回参数_主要参考](https://blog.csdn.net/weixin_43564627/article/details/117959237) - [使用springMVC AOP实现日记记录_springmvc下配置](https://blog.csdn.net/A13432421434/article/details/71081353) - [注解@Slf4j的使用 - 简书 (jianshu.com)](https://www.jianshu.com/p/6e137ee836a1) - [利用Jackson封装常用JsonUtil工具类_mengqingming1的博客-CSDN博客_jackson 通用工具类](https://blog.csdn.net/mengqingming1/article/details/106050120/) **思路:** 自定义注解,针对注解创建切面,对Controller 中的方法使用注解,通过切面中的 @Before, @Around 获取数据并打印 ## 实现步骤 > 完整代码地址:https://gitee.com/springff/logprint 日志打印 pom.xml 依赖 ```xml 4.3.12.RELEASE 2.9.1 1.8.9 1.2.2 1.16.18 ``` spring-mvc.xml 添加 aop 自动代理 `` 新建注解 LogPrint,将注解作为切点,作用到 Controller 的方法 ```java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface LogPrint { String description() default ""; } ``` 新建切面 LogPrintAspect,在 controller 方法调用前,调用后打印入参,出参 ```java @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 类中的方法 ```java @RestController public class LogController { @LogPrint @RequestMapping("/logGet") public Object getTest(String name, String age){ String content = name + "今年" + age + "岁"; HashMap resultMap = new HashMap<>(); resultMap.put("content", content); return resultMap; } } ``` **日志打印结果** ![image-20210831205545751](assets/readme/image-20210831205545751.png) ## **过程记录** 日志打印存在的问题:打印请求与打印响应并不是相邻输出,查看日志的时候需要添加上过滤条件 jackson 直接返回带中文的字符串,中文显示乱码 `????18?`。将字符串放到HashMap 中返回,中文正常显示`{"content": "张三今年18岁"}` @LogPrint 注解加上后日志不打印?`` 没有添加导致 aop 在 spring 框架中不启用 日志打印简化版本,日志过滤 添加 ```xml ``` todo - 注解的实现 - jsonUtil 的实现 - jackson post 请求拿不到数据(使用 postman模拟请求前提下) - 根据日志id,过滤日志,在 linux 中怎样进行过滤 ## 其他参考 - [SpringMvc配置Aop的两种方式 - HaowenBi - 博客园 (cnblogs.com)](https://www.cnblogs.com/jiangxishicheng/p/10896498.html) - [springAOP拦截并打印controller层请求日志---注解方式实现_wendrewshay-CSDN博客](https://blog.csdn.net/wendrewshay/article/details/78424508) - [springmvc controller自动打印出入参数以及打印其他有用信息 - 沉默的背影 - 博客园 (cnblogs.com)](https://www.cnblogs.com/zxporz/p/14174234.html) - [Spring MVC打印@RequestBody、@Response日志的方法_java_脚本之家 (jb51.net)](https://www.jb51.net/article/155828.htm)