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

简介: 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


相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
相关文章
|
5月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
867 5
|
11月前
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
2698 1
|
11月前
|
Java 微服务 Spring
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录——使用Logger在项目中打印日志
本文介绍了如何在项目中使用Logger打印日志。通过SLF4J和Logback,可设置不同日志级别(如DEBUG、INFO、WARN、ERROR)并支持占位符输出动态信息。示例代码展示了日志在控制器中的应用,说明了日志配置对问题排查的重要性。附课程源码下载链接供实践参考。
1240 0
|
11月前
|
SQL Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— application.yml 中对日志的配置
在 Spring Boot 项目中,`application.yml` 文件用于配置日志。通过 `logging.config` 指定日志配置文件(如 `logback.xml`),实现日志详细设置。`logging.level` 可定义包的日志输出级别,例如将 `com.itcodai.course03.dao` 包设为 `trace` 级别,便于开发时查看 SQL 操作。日志级别从高到低为 ERROR、WARN、INFO、DEBUG,生产环境建议调整为较高级别以减少日志量。本课程采用 yml 格式,因其层次清晰,但需注意格式要求。
1062 0
|
11月前
|
Java API 开发者
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录——slf4j 介绍
在软件开发中,`System.out.println()`常被用于打印信息,但大量使用会增加资源消耗。实际项目推荐使用slf4j结合logback输出日志,效率更高。Slf4j(Simple Logging Facade for Java)是一个日志门面,允许开发者通过统一方式记录日志,无需关心具体日志系统。它支持灵活切换日志实现(如log4j或logback),且具备简洁占位符和日志级别判断等优势。阿里巴巴《Java开发手册》强制要求使用slf4j,以保证日志处理方式的统一性和维护性。使用时只需通过`LoggerFactory`创建日志实例即可。
750 0
|
10月前
|
JSON API 数据格式
【Azure APIM】如何把APIM中处理的请求的所有请求头保存在日志中?
Azure API Management 默认诊断日志不记录请求的 Header 和 Body 信息。为实现记录,可通过配置 Trace 策略解决。例如,使用 `context.Request.Headers` 和 `context.Request.Body` 获取相关信息,并以 JSON 或字符串格式保存。示例代码展示了如何将 Headers 转换为 JSON 或逗号分隔字符串形式记录。相关参考资料包括 Set Body Policy 和 Trace Policy 官方文档,帮助进一步了解与扩展功能。
245 36
|
11月前
|
Java API 微服务
微服务——SpringBoot使用归纳——Spring Boot中的切面AOP处理——Spring Boot 中的 AOP 处理
本文详细讲解了Spring Boot中的AOP(面向切面编程)处理方法。首先介绍如何引入AOP依赖,通过添加`spring-boot-starter-aop`实现。接着阐述了如何定义和实现AOP切面,包括常用注解如`@Aspect`、`@Pointcut`、`@Before`、`@After`、`@AfterReturning`和`@AfterThrowing`的使用场景与示例代码。通过这些注解,可以分别在方法执行前、后、返回时或抛出异常时插入自定义逻辑,从而实现功能增强或日志记录等操作。最后总结了AOP在实际项目中的重要作用,并提供了课程源码下载链接供进一步学习。
1480 0
|
11月前
|
Java 开发者 微服务
微服务——SpringBoot使用归纳——Spring Boot中的切面AOP处理——什么是AOP
本文介绍了Spring Boot中的切面AOP处理。AOP(Aspect Oriented Programming)即面向切面编程,其核心思想是分离关注点。通过AOP,程序可以将与业务逻辑无关的代码(如日志记录、事务管理等)从主要逻辑中抽离,交由专门的“仆人”处理,从而让开发者专注于核心任务。这种机制实现了模块间的灵活组合,使程序结构更加可配置、可扩展。文中以生活化比喻生动阐释了AOP的工作原理及其优势。
564 0
|
监控 Java Maven
springboot学习二:springboot 初创建 web 项目、修改banner、热部署插件、切换运行环境、springboot参数配置,打包项目并测试成功
这篇文章介绍了如何快速创建Spring Boot项目,包括项目的初始化、结构、打包部署、修改启动Banner、热部署、环境切换和参数配置等基础操作。
1642 0
|
Java Maven Spring
【IntelliJ IDEA】使用Maven方式构建Spring Boot Web 项目(超详细)2
【IntelliJ IDEA】使用Maven方式构建Spring Boot Web 项目(超详细)
3444 3