# 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;
}
}
```
**日志打印结果**

## **过程记录**
日志打印存在的问题:打印请求与打印响应并不是相邻输出,查看日志的时候需要添加上过滤条件
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)