spring boot自定義注解打印日志
在實(shí)際項(xiàng)目中可能需要監(jiān)控每個(gè)接口的請(qǐng)求時(shí)間以及請(qǐng)求參數(shù)等相關(guān)信息,那么此時(shí)我們想到的就是兩種實(shí)現(xiàn)方式,一種是通過(guò)攔截器實(shí)現(xiàn),另一種則通過(guò)AOP自定義注解實(shí)現(xiàn)。
本文介紹自定義注解實(shí)現(xiàn)方式
自定義注解,四個(gè)元注解這次就不解釋了。
1
2
3
4
5
6
7
8
|
@Retention (RetentionPolicy.RUNTIME) @Target (ElementType.METHOD) public @interface WebLog { /** * 日志信息描述 */ String description() default "" ; } |
AOP實(shí)現(xiàn):
1.@Order注解用來(lái)定義切面的執(zhí)行順序,數(shù)值越小優(yōu)先級(jí)越高。
2.@Around環(huán)繞通知,我們可以自定義在什么時(shí)候執(zhí)行@Before以及@After。
3.ThreadLocal針對(duì)每個(gè)線程都單獨(dú)的記錄。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
@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( "請(qǐng)求URL:" +request.getRequestURL()); System.out.println( "請(qǐng)求參數(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)繞方法開(kāi)始************" ); td.set(point); long startTime = System.currentTimeMillis(); ProceedingJoinPoint joinPoint = td.get(); Object proceed = joinPoint.proceed(); System.out.println( "執(zhí)行耗時(shí)毫秒:" + (System.currentTimeMillis()-startTime)); System.out.println( "***********執(zhí)行環(huán)繞方法結(jié)束************" ); return proceed; } } |
Controller
1
2
3
4
5
6
7
8
|
@RestController public class LoginController { @PostMapping ( "/user/login" ) @WebLog (description = "用戶登錄接口" ) public UserForm login( @RequestBody UserForm user){ return user; } } |
測(cè)試結(jié)果
通過(guò)自定義注解獲取日志
1.定義一個(gè)注解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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 : [email protected] * @date : 2020/8/8 20:09 */ @Retention (RetentionPolicy.RUNTIME) @Target (ElementType.METHOD) public @interface Check { } |
2.寫一個(gè)測(cè)試用類,并使用注解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
package com.hisense.demo02; /** * @author : sunkepeng E-mail : [email protected] * @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( "永無(wú)bug" ); } } |
3.使用注解,在測(cè)試類中輸出log
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
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 : [email protected] * @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(); } } |
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://blog.csdn.net/kin_wen/article/details/93412270