用SpringBoot搭建个人博客01-----使用AOP统一处理Web请求日志

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: AOP 是面向切面的编程,就是在运行期通过动态代理的方式对代码进行增强处理,比较核心的概念有 切点,切面,通知,有关AOP的详情参考:。本文要介绍的是在一个SpringBoot项目中如何统一的处理Web请求日志,基本思想还是采用AOP的方式,拦截请求,然后,写入日志。

摘要

AOP 是面向切面的编程,就是在运行期通过动态代理的方式对代码进行增强处理,比较核心的概念有 切点,切面,通知,有关AOP的详情参考:。

本文要介绍的是在一个SpringBoot项目中如何统一的处理Web请求日志,基本思想还是采用AOP的方式,拦截请求,然后,写入日志。

相关依赖

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

项目引入spring-boot-starter-web 依赖之后无需在引入相关的日志依赖,因为spring-boot-starter-web中已经集成了slf4j 的依赖。

引入spring-boot-starter-aop 依赖之后,AOP 的功能即是启动状态,无需在添加@EnableAspectJAutoProxy注解。

cef682758f8d63c09901ee95d72701e8_70.png

9a6a5a4bc220588d9269ee3edc98677f_70.png

定义系统日志注解

/**
 * 系统日志注解
 * Created by xiang.wei on 2018/10/17
 *
 * @author xiang.wei
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {
    String value() default "";
}

定义切面

@Aspect
@Component
public class SysLogAspect {
    private Logger logger = LoggerFactory.getLogger(SysLogAspect.class);
//    @Autowired
//    private MtoLogService mtoLogService;
    /**
     * 定义日志切点
     */
    @Pointcut("@annotation(com.jay.common.annotation.SysLog)")
    public void logPointCut() {
    }
    /**
     * 环绕通知
     * @param point
     * @return
     */
    @Around("logPointCut()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        long startTime = System.currentTimeMillis();
        Object proceed = point.proceed();
//        执行时长
        long time = System.currentTimeMillis() - startTime;
        saveSysLog(point, time);
        return proceed;
    }
    private void saveSysLog(ProceedingJoinPoint joinPoint, long time) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        MtoLog mtoLog = new MtoLog();
//      获取注解内容
        SysLog annotation = method.getAnnotation(SysLog.class);
        if (annotation != null) {
            mtoLog.setOperation(annotation.value());
        }
//        获取类名
        String className = joinPoint.getTarget().getClass().getName();
//        获取方法名
        String methodName = method.getName();
        mtoLog.setMethod(className + "." + methodName + "()");
//       获取参数
        Object[] args = joinPoint.getArgs();
        if (args != null) {
            String param = JSON.toJSONString(args[0]);
            mtoLog.setParams(param);
        }
        mtoLog.setTime(time);
        HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
        mtoLog.setIp(IpUtil.getIpAddr(request));
        mtoLog.setCreateDate(new Date());
        logger.info("请求的参数="+JSON.toJSONString(mtoLog));
//        mtoLogService.insert(mtoLog);
    }
}

使用

@SysLog("登录接口")
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public String login(String username,String password,
                        @RequestParam(value = "rememberMe", defaultValue = "0") int rememberMe,
                        ModelMap model) {
。。。。
}

运行效果:

4489e9368d711ff05578fbf6e02ffc8f_70.png

参考博客

http://blog.didispace.com/springbootaoplog/


代码地址

https://github.com/XWxiaowei/JayBlog/tree/v3-logback-validation


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
4月前
|
Java 中间件
SpringBoot入门(6)- 添加Logback日志
SpringBoot入门(6)- 添加Logback日志
146 5
|
2月前
|
Java 应用服务中间件 Spring
SpringBoot 响应请求是串行还是并行?
Spring Boot 在默认情况下通过 Servlet 容器的线程池实现并行处理 HTTP 请求。通过适当的线程池配置,可以进一步优化并发性能。此外,Spring Boot 提供了异步处理机制(如使用 `@Async` 注解)和反应式编程模型(Spring WebFlux),使得应用能够处理更高的并发负载。在具体项目中,可以根据需求选择合适的处理模型,以充分利用 Spring Boot 的并发处理能力。
63 21
|
2月前
|
开发框架 运维 监控
Spring Boot中的日志框架选择
在Spring Boot开发中,日志管理至关重要。常见的日志框架有Logback、Log4j2、Java Util Logging和Slf4j。选择合适的日志框架需考虑性能、灵活性、社区支持及集成配置。本文以Logback为例,演示了如何记录不同级别的日志消息,并强调合理配置日志框架对提升系统可靠性和开发效率的重要性。
|
2月前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
97 8
|
4月前
|
Java 中间件
SpringBoot入门(6)- 添加Logback日志
SpringBoot入门(6)- 添加Logback日志
86 1
|
4月前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
85 1
|
4月前
|
JavaScript 前端开发 Java
SpringBoot项目的html页面使用axios进行get post请求
SpringBoot项目的html页面使用axios进行get post请求
59 0
|
2月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的留守儿童爱心网站设计与实现(计算机毕设项目实战+源码+文档)
博主是一位全网粉丝超过100万的CSDN特邀作者、博客专家,专注于Java、Python、PHP等技术领域。提供SpringBoot、Vue、HTML、Uniapp、PHP、Python、NodeJS、爬虫、数据可视化等技术服务,涵盖免费选题、功能设计、开题报告、论文辅导、答辩PPT等。系统采用SpringBoot后端框架和Vue前端框架,确保高效开发与良好用户体验。所有代码由博主亲自开发,并提供全程录音录屏讲解服务,保障学习效果。欢迎点赞、收藏、关注、评论,获取更多精品案例源码。
90 10
|
2月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的家政服务管理平台设计与实现(计算机毕设项目实战+源码+文档)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
72 8
|
2月前
|
JavaScript 搜索推荐 Java
基于SpringBoot+Vue实现的家乡特色推荐系统设计与实现(源码+文档+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
91 8

热门文章

最新文章