參考
- 搜索關鍵字: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 中怎樣進行過濾