好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

详解AOP与Filter拦截请求打印日志实用例子

相信各位同道在写代码的时候,肯定会写一些日志打印,因为这对往后的运维而言,至关重要的。

那么我们请求一个restfull接口的时候,哪些信息是应该被日志记录的呢?

以下做了一个基本的简单例子,这里只是示例说明基本常规实现记录的信息,根据项目的真实情况选用:

1 . http请求 拦截 器(filter) : 从httpservletrequest获取基本的请求信息

?

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

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

import name.ealen.util.httputil;

import org.slf4j.logger;

import org.slf4j.loggerfactory;

import org.springframework.beans.factory.annotation.qualifier;

import org.springframework.boot.web.servlet.filterregistrationbean;

import org.springframework.context.annotation.bean;

import org.springframework.context.annotation.configuration;

import org.springframework.core.annotation.order;

 

import javax.servlet.*;

import javax.servlet.http.httpservletrequest;

import javax.servlet.http.httpservletresponse;

import java.io.ioexception;

 

/**

  * created by ealenxie on 2018/9/7 15:56.

  * http请求拦截器,日志打印请求基本相关信息

  */

@configuration

public class filterconfiguration {

 

   private static final logger log = loggerfactory.getlogger(filterconfig. class );

 

   @bean

   @order (integer.min_value)

   @qualifier ( "filterregistration" )

   public filterregistrationbean filterregistration() {

     filterregistrationbean<filter> registration = new filterregistrationbean<>();

     registration.setfilter(controllerfilter());

     registration.addurlpatterns( "/*" );

     return registration;

   }

 

   private filter controllerfilter() {

     return new filter() {

       @override

       public void init(filterconfig filterconfig) {

         log.info( "controllerfilter init success" );

       }

 

       @override

       public void dofilter(servletrequest servletrequest, servletresponse servletresponse, filterchain chain) throws ioexception, servletexception {

         httpservletrequest request = (httpservletrequest) servletrequest;

         httpservletresponse response = (httpservletresponse) servletresponse;

         string requestid = request.getheader( "request-id" );

         if (requestid == null ) requestid = request.getrequestedsessionid();

         system.out.println();

         log.info( "http request request-id : " + requestid);

         log.info( "http request information : {\"uri\":\"" + request.getrequesturl() +

             "\",\"requestmethod\":\"" + request.getmethod() +

             "\",\"clientip\":\"" + httputil.getipaddress(request) +

             "\",\"content-type\":\"" + request.getcontenttype() +

             "\"}" );

         chain.dofilter(request, response);

       }

 

       @override

       public void destroy() {

         log.info( "controllerfilter destroy" );

       }

     };

   }

}

2 . controller的拦截aop : 获取 请求的对象,请求参数,返回数据,请求返回状态,内部方法耗时。

?

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

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

import com.alibaba.fastjson.json;

import org.aspectj.lang.proceedingjoinpoint;

import org.aspectj.lang.annotation.around;

import org.aspectj.lang.annotation.aspect;

import org.slf4j.logger;

import org.slf4j.loggerfactory;

import org.springframework.core.env.environment;

import org.springframework.http.httpstatus;

import org.springframework.http.responseentity;

import org.springframework.stereotype.component;

 

import javax.annotation.resource;

 

/**

  * created by ealenxie on 2018/9/7 14:19.

  * aop 打印日志 : 请求的对象,请求参数,返回数据,请求状态,内部方法耗时

  */

@aspect

@component

public class controllerinterceptor {

 

   private static final logger log = loggerfactory.getlogger(controllerinterceptor. class );

   @resource

   private environment environment;

 

   @around (value = "execution (* name.ealen.web.*.*(..))" )

   public object processapifacade(proceedingjoinpoint pjp) {

     string appname;

     try {

       appname = environment.getproperty( "spring.application.name" ).touppercase();

     } catch (exception e) {

       appname = "unnamed" ;

     }

     long starttime = system.currenttimemillis();

     string name = pjp.gettarget().getclass().getsimplename();

     string method = pjp.getsignature().getname();

     object result = null ;

     httpstatus status = null ;

     try {

       result = pjp.proceed();

       log.info( "requesttarget : " + appname + "." + name + "." + method);

       log.info( "requestparam : " + json.tojson(pjp.getargs()));

       if (result instanceof responseentity) {

         status = ((responseentity) result).getstatuscode();

       } else {

         status = httpstatus.ok;

       }

     } catch (throwable throwable) {

       status = httpstatus.internal_server_error;

       result = new responseentity<>( "{\"internal server error\" : \"" + throwable.getmessage() + "\"}" , status);

       throwable.printstacktrace();

     } finally {

       log.info( "responseentity : {" + "\"httpstatus\":\"" + status.tostring() + "\"" + ",\"responsebody\": " + json.tojson(result) + "}" );

       log.info( "internal method cost time: {}ms" , system.currenttimemillis() - starttime);

     }

     return result;

   }

}

3 . 提供一个简单的restfull接口 :

?

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

package name.ealen.web;

 

import org.springframework.http.httpstatus;

import org.springframework.http.responseentity;

import org.springframework.web.bind.annotation.requestbody;

import org.springframework.web.bind.annotation.requestmapping;

import org.springframework.web.bind.annotation.restcontroller;

 

/**

  * created by ealenxie on 2018/9/7 14:24.

  */

@restcontroller

public class sayhellocontroller {

 

   @requestmapping ( "/sayhello" )

   public string sayhello() {

     return "hello world" ;

   }

 

   @requestmapping ( "/say" )

   public responseentity<?> say( @requestbody object o) {

     return new responseentity<>(o, httpstatus.ok);

   }

 

}

4 . 使用postman进行基本测试 :

5 . 控制台可以看到基本效果 :

以上只是关于controller应该记录日志的一个简单的例子,完整代码可见 https://github.com/ealenxie/springboot-controller-logger

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

原文链接:http://www.cnblogs.com/ealenxie/p/9618693.html

查看更多关于详解AOP与Filter拦截请求打印日志实用例子的详细内容...

  阅读:47次