使用spring boot通過自定義注解打印所需日志
spring boot自定義注解打印日志
在實際項目中可能需要監(jiān)控每個接口的請求時間以及請求參數(shù)等相關信息,那么此時我們想到的就是兩種實現(xiàn)方式,一種是通過攔截器實現(xiàn),另一種則通過AOP自定義注解實現(xiàn)。
本文介紹自定義注解實現(xiàn)方式
自定義注解,四個元注解這次就不解釋了。
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface WebLog { /** * 日志信息描述 */ String description() default ""; }
AOP實現(xiàn):
1.@Order注解用來定義切面的執(zhí)行順序,數(shù)值越小優(yōu)先級越高。
2.@Around環(huán)繞通知,我們可以自定義在什么時候執(zhí)行@Before以及@After。
3.ThreadLocal針對每個線程都單獨的記錄。
@Aspect @Component public class WebLogAspect { private static ThreadLocal<ProceedingJoinPoint> td = new ThreadLocal<>(); @Pointcut("@annotation(com.example.demo.annotation.WebLog)") @Order(1) public void webLog(){} @Before("webLog()") public void doBefor(JoinPoint point){ System.out.println("***********method before執(zhí)行************"); ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); System.out.println("請求URL:"+request.getRequestURL()); System.out.println("請求參數(shù):"+ Arrays.toString(point.getArgs())); System.out.println("***********method before結(jié)束************"); } @Around("webLog()") public Object doAround(ProceedingJoinPoint point) throws Throwable { System.out.println("***********執(zhí)行環(huán)繞方法開始************"); td.set(point); long startTime = System.currentTimeMillis(); ProceedingJoinPoint joinPoint = td.get(); Object proceed = joinPoint.proceed(); System.out.println("執(zhí)行耗時毫秒:"+ (System.currentTimeMillis()-startTime)); System.out.println("***********執(zhí)行環(huán)繞方法結(jié)束************"); return proceed; } }
Controller
@RestController public class LoginController { @PostMapping("/user/login") @WebLog(description = "用戶登錄接口") public UserForm login(@RequestBody UserForm user){ return user; } }
測試結(jié)果
通過自定義注解獲取日志
1.定義一個注解
package com.hisense.demo02; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @author : sunkepeng E-mail : sunkepengouc@163.com * @date : 2020/8/8 20:09 */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Check { }
2.寫一個測試用類,并使用注解
package com.hisense.demo02; /** * @author : sunkepeng E-mail : sunkepengouc@163.com * @date : 2020/8/8 20:04 */ public class Calculator { @Check public void add(){ System.out.println("1+0=" + (1+0)); } @Check public void sub(){ System.out.println("1-0=" + (1-0)); } @Check public void mul(){ System.out.println("1*0=" + (1*0)); } @Check public void div(){ System.out.println("1/0=" + (1/0)); } public void show(){ System.out.println("永無bug"); } }
3.使用注解,在測試類中輸出log
package com.hisense.demo02; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.lang.reflect.Method; /** * @author : sunkepeng E-mail : sunkepengouc@163.com * @date : 2020/8/8 21:39 */ public class TestCheck { public static void main(String[] args) throws IOException { Calculator calculator = new Calculator(); Class calculatorClass = calculator.getClass(); Method[] methods = calculatorClass.getMethods(); int number =0; BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("bug.txt")); for (Method method : methods) { if (method.isAnnotationPresent(Check.class)){ try { method.invoke(calculator); } catch (Exception e) { number++; bufferedWriter.write(method.getName()+"出現(xiàn)異常"); bufferedWriter.newLine(); bufferedWriter.write("異常的名稱:"+e.getCause().getClass().getSimpleName()); bufferedWriter.newLine(); bufferedWriter.write("異常的原因"+e.getCause().getMessage()); bufferedWriter.newLine(); bufferedWriter.write("-----------------"); bufferedWriter.newLine(); } } } bufferedWriter.write("本次共出現(xiàn):"+number+"次異常"); bufferedWriter.flush(); bufferedWriter.close(); } }
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java多線程中wait、notify、notifyAll使用詳解
這篇文章主要介紹了Java多線程中wait、notify、notifyAll使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05

Mybatis中3種關聯(lián)關系的實現(xiàn)方法示例

jeefast和Mybatis實現(xiàn)三級聯(lián)動的示例代碼

mybatis?resultMap之collection聚集兩種實現(xiàn)方式

Spring超詳細講解創(chuàng)建BeanDefinition流程