SpringBoot 系列(4)- 记录请求日志
需求
当我们开发一个网站,比如说一个电商网站,如果能够记录客户的请求信息,对于我们将来的一些操作是非常重要的。以下是一些可记录的点
用户使用什么浏览器、操作系统、手机等
用户访问了哪些网页、停留了多长时间等
用户从哪来的(网页搜索、收藏夹等)
。。。 通过分析这些数据,可以获知许多对网站运营至关重要的信息。采集的数据越全面,分析就能越精准。甚至于到后期还可以使用大数据的技术进行深度的挖掘,给每个用户推荐合适的产品(就像现在天猫、京东等等)。
如何采集日志
一般来讲采集日志信息有几种方式:
访问Web服务器时直接记录
通过在页面嵌入js代码来获取信息(百度统计就是这么干的),ajax发送到后台
拦截日志请求
为了统计或其他目的,我们需要对访问我们网站的数据进行记录,那么在这种情况下,就需要对请求的日志进行拦截。
在Spring终拦截可以有两种方式实现,一种是实现HandlerInterceptor
,另一种是使用实现Filter
。接下来我将会一一介绍这两种实现方式
HandlerInterceptor 拦截器
这里说的拦截器指的的是SpringMVC框架中的HandlerInterceptor,它是由Spring框架支持的。HandlerInterceptor接口中有三个方法:
preHandle 在请求处理之前进行调用
postHandle 当前请求进行处理之后,也就是Controller 方法调用之后执行
afterCompletion 该方法将在整个请求结束之后执行
在SpringMvc中 Interceptor的调用是链式调用(与Filter类似),在请求中会将适用与该请求的所有拦截器按照其声明的顺序依次调用。
先依次调用preHandle方法,如果preHandle方法返回true继续调用下一个Interceptor 的preHandle方法,执行完就调用当前请求的Controller方法;如果返回false,则直接返回,不再继续执行。
Controller执行结束之后,视图渲染之前,postHandle会以与preHandle方法相反的顺序开始执行
当DispatcherServlet渲染了对应的视图之后,开始执行afterCompletion方法。其执行顺序与postHandle相同。 这个方法的主要作用是用于进行资源清理工作的。
使用Filter拦截日志
除了使用 HandlerInterceptor ,也可以使用Filter记录日志,与 HandlerInterceptor 类似,可以在请求前或请求后对日志进行记录。
request请求参数分两种类型:
url中的参数,可以使用request.getParameterMap()获取,没有任何影响
requestBody中的参数,如果在过滤器中getInputStream后就会被消耗掉,后面的程序就无法再次获取,所以需要对流进行复制,避免后续的处理不能读取该流中的数据。
response的输出有两种方式,都需要考虑到并重写
getOutputStream()
getWrite()
请求日志过滤器
Request包装器,避免后续类无法获取request Body中的数据。
Response包装器
使用AOP记录日志
使用 HandlerInterceptor 和 Filter 记录日志只能记录web请求的日志,而不能记录其他方法调用产生的日志。 如果使用 AOP 的方式记录日志,那么就可以对其余的方法调用也进行记录。 必须知道的概念
AOP 的相关术语
通知(Advice) 通知描述了切面要完成的工作以及何时执行。前置通知(Before):在目标方法调用前调用通知功能;后置通知(After):在目标方法调用之后调用通知功能,不关心方法的返回结果;返回通知(AfterReturning):在目标方法成功执行之后调用通知功能;异常通知(AfterThrowing):在目标方法抛出异常后调用通知功能;环绕通知(Around):通知包裹了目标方法,在目标方法调用之前和之后执行自定义的行为。
连接点(JoinPoint) 通知功能被应用的时机。
切点(Pointcut) 切点定义了通知功能被应用的范围。
切面(Aspect) 切面是通知和切点的结合,定义了何时、何地应用通知功能。
引入(Introduction) 在无需修改现有类的情况下,向现有的类添加新方法或属性。
织入(Weaving) 把切面应用到目标对象并创建新的代理对象的过程。
Spring 中使用 AOP 记录日志
通过不同的切点表达式,可以在不同的方法调用的时候使用日志,本次使用注解
定义日志注解
定义日志切面,只是简单的演示,可以把日志记录到数据库或其他日志系统
日志的使用
版权声明: 本文为 InfoQ 作者【引花眠】的原创文章。
原文链接:【http://xie.infoq.cn/article/8725d73dc9784d46bc36e9b89】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论