Spring boot配置AOP统一处理Web请求日志

开发环境

系统:MacOS Mojave 版本10.14.6

IDE:IDEA2020.1.2

Java:Java1.8

概述

为什么需要AOP统一处理Web请求日志

我们有了AOP统一处理之后,实际上是对于系统健壮性的一种保证,在真实的项目中几乎都会有这样的一个功能,会用Filter把每一个请求都给打印出来,这样良好的习惯可以提高开发和调试的效率,我们将要做的目的就是创建Filter,并且把我们的请求信息和返回的信息给打印出来,然后我们发一个这样的请求,并且看一看它打印出来的内容,究竟是什么!

用之前的项目接口测试:

Spring boot集成Mybatis和SQL Server

开发环境 系统:MacOS Mojave 版本10.14.6 IDE:IDEA2020.1.2 Java:Ja

Spring Boot配置log4j2日志

开发环境 系统:MacOS Mojave 版本10.14.6 IDE:IDEA2020.1.2 Java:Ja

一、引入依赖

首先到pom.xml,引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

有了这个依赖之后,我们要去建一个过滤器,来对我们的请求拦截和打印

二、创建过滤器类

类上添加注解【@Aspect】,还需要添加【@Component】注解让Spring识别到,类里编写拦截内容、拦截点。

2.1、过滤器类:

package com.lmtai.demo.filter;

import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

/**
 * 打印请求和响应信息
 */
@Aspect
@Component
public class WebLogAspect {

}

2.2、定义一个方法,这个方法主要指定拦截点,添加注解【@Pointcut】,所有的Controller 类与方法:

@Pointcut("execution(public * com.lmtai.demo.controller.*.*(..))")
public void webLog(){

}

2.3、在拦截点的前和后分别拦截,在之前是请求信息,之后是响应信息,利用LoggerFactory.getLogger()方法,传入当前类的类名。

完整过滤器类文件:

package com.lmtai.demo.filter;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;

/**
 * 打印请求和响应信息
 */
@Aspect
@Component
public class WebLogAspect {
    private final Logger log = LoggerFactory.getLogger(WebLogAspect.class);

    @Pointcut("execution(public * com.lmtai.demo.controller.*.*(..))")
    public void webLog(){

    }

    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint){
        // 收到请求,记录请求内容
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        // 得到当前请求
        HttpServletRequest request = attributes.getRequest();

        // 对日志进行记录
        // URL的信息
        log.info("URL : " + request.getRequestURL().toString());
        // 请求的类型
        log.info("HTTP_METHOD : " + request.getMethod());
        // ip信息
        log.info("IP : " + request.getRemoteAddr());
        // 类的方法 joinPoint.getSignature().getDeclaringTypeName()获取类信息
        log.info("CLASS_METHOD" + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
        // 参数 joinPoint.getArgs()参数数组 toString方法转化为String内容
        log.info("ARGS : " + Arrays.toString(joinPoint.getArgs()));
    }

    // 返回内容res,拦截点 webLog()
    @AfterReturning(returning = "res", pointcut = "webLog()")
    public void doAfterReturning(Object res) throws JsonProcessingException {
        // 处理完请求,返回内容
        // res是对象  利用objectMapper.对象转为Json
        log.info("RESPONSE : " + new ObjectMapper().writeValueAsString(res));
    }
}

实验测试

运行程序,进入浏览器,打开localhost:8080/test

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.2.1.RELEASE)

[08:06 17:23:55.403] [INFO] [com.lmtai.demo.DemoApplication] - Starting DemoApplication on BowyndeMacBook-Pro.local with PID 11345 (/Users/bowyn/Documents/Java/sqlserver/sourceCode/test-demo/target/classes started by bowyn in /Users/bowyn/Documents/Java/sqlserver/sourceCode/test-demo)
[08:06 17:23:55.406] [INFO] [com.lmtai.demo.DemoApplication] - No active profile set, falling back to default profiles: default
[08:06 17:23:56.581] [INFO] [org.springframework.boot.web.embedded.tomcat.TomcatWebServer] - Tomcat initialized with port(s): 8080 (http)
[08:06 17:23:56.592] [INFO] [org.apache.coyote.http11.Http11NioProtocol] - Initializing ProtocolHandler ["http-nio-8080"]
[08:06 17:23:56.593] [INFO] [org.apache.catalina.core.StandardService] - Starting service [Tomcat]
[08:06 17:23:56.593] [INFO] [org.apache.catalina.core.StandardEngine] - Starting Servlet engine: [Apache Tomcat/9.0.27]
[08:06 17:23:56.675] [INFO] [org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/]] - Initializing Spring embedded WebApplicationContext
[08:06 17:23:56.676] [INFO] [org.springframework.web.context.ContextLoader] - Root WebApplicationContext: initialization completed in 1194 ms
[08:06 17:23:57.337] [INFO] [org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor] - Initializing ExecutorService 'applicationTaskExecutor'
[08:06 17:23:57.670] [INFO] [org.apache.coyote.http11.Http11NioProtocol] - Starting ProtocolHandler ["http-nio-8080"]
[08:06 17:23:57.701] [INFO] [org.springframework.boot.web.embedded.tomcat.TomcatWebServer] - Tomcat started on port(s): 8080 (http) with context path ''
[08:06 17:23:57.703] [INFO] [com.lmtai.demo.DemoApplication] - Started DemoApplication in 2.598 seconds (JVM running for 3.506)
[08:06 17:24:05.014] [INFO] [org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/]] - Initializing Spring DispatcherServlet 'dispatcherServlet'
[08:06 17:24:05.033] [INFO] [org.springframework.web.servlet.DispatcherServlet] - Initializing Servlet 'dispatcherServlet'
[08:06 17:24:05.080] [INFO] [org.springframework.web.servlet.DispatcherServlet] - Completed initialization in 47 ms
[08:06 17:24:05.101] [INFO] [com.lmtai.demo.filter.WebLogAspect] - URL : http://localhost:8080/test
[08:06 17:24:05.102] [INFO] [com.lmtai.demo.filter.WebLogAspect] - HTTP_METHOD : GET
[08:06 17:24:05.102] [INFO] [com.lmtai.demo.filter.WebLogAspect] - IP : 0:0:0:0:0:0:0:1
[08:06 17:24:05.103] [INFO] [com.lmtai.demo.filter.WebLogAspect] - CLASS_METHODcom.lmtai.demo.controller.StudentController.personalPage
[08:06 17:24:05.104] [INFO] [com.lmtai.demo.filter.WebLogAspect] - ARGS : []
[08:06 17:24:05.144] [INFO] [com.zaxxer.hikari.HikariDataSource] - student_management_datasource - Starting...
[08:06 17:24:05.452] [INFO] [com.zaxxer.hikari.HikariDataSource] - student_management_datasource - Start completed.
[08:06 17:24:05.582] [INFO] [com.lmtai.demo.filter.WebLogAspect] - RESPONSE : {"sno":1,"sn":"王玲","sd":"计算机","sb":646671600000,"sex":"女"}

成功打印出URL的信息、请求的类型、IP信息、类的方法、参数、返回对象,有了这样强大的能力之后,这些都会被记录到info日志文件中,我们再遇到问题去排查,就有地方使了。如果这些信息都丢失的话,很难排查到问题所在。

Java

Spring Boot配置log4j2日志

2020-8-6 14:52:16

Java

线程池——治理线程的最大法宝

2020-8-9 21:23:13

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索