SpringBoot 学习记录(五): aop记录日志

SpringBoot Aop 记录操作日志存入数据库 SpringBoot Aop 记录操作日志存入数据库 本文不探讨具体原理,只讲业务实现。我主要是将这个操作分为以下几步: 1.首先我们需要自定义一个操作注解来获取我们拦截的接口的相关信息 2.那么接下来就是这个操作注解放在哪里了 我们需要将该注解放在我们需要拦截的接口上,那这个接口具体属于哪个模块,我们就可以命名moduleName即模块名,option就是这个接口具体是干什么的。注意,所有加... 阅读详情

在Spring框架应用中,我们使用aop一般都是通过配置来实现,在spring_boot中我们只需要定义一个java类,使用注解方式来实现

具体步骤如下:

一,引入依赖,在pom.xml中添加:

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

二,编写切面类,这里主要是记录日志,LogAop

package com.example.aop;

import java.util.Arrays;
import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
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.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

@Component
@Aspect // 将一个java类定义为切面类
@Order(-1)//如果有多个aop,这里可以定义优先级,越小级别越高
public class LogAop {

	private Logger logger = LoggerFactory.getLogger(this.getClass());
	
	ThreadLocal<Long> startTime = new ThreadLocal<Long>();

	/**
	 * 定义一个切入点,注意这里只定义controller包
	 */
	@Pointcut("execution(public * com.example.controller..*.*(..))")
	public void log() {

	}

	/**
	 * 在切入点开始处切入内容
	 * @param joinPoint
	 */
	@Before("log()")
	public void doBefore(JoinPoint joinPoint) {
		
		startTime.set(System.currentTimeMillis());

		// 接收到请求,记录请求内容
		logger.info("LogAop.doBefore()");
		RequestAttributes ra = RequestContextHolder.getRequestAttributes();  
		ServletRequestAttributes sra = (ServletRequestAttributes) ra;  
		HttpServletRequest request = sra.getRequest(); 

		// 记录下请求内容
		logger.info("URL : " + request.getRequestURL().toString());
		logger.info("HTTP_METHOD : " + request.getMethod());
		logger.info("IP : " + request.getRemoteAddr());
		logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "."
				+ joinPoint.getSignature().getName());
		logger.info("ARGS : " + Arrays.toString(joinPoint.getArgs()));
		// 获取所有参数方法一:
		Enumeration<String> enu = request.getParameterNames();
		while (enu.hasMoreElements()) {
			String paraName = (String) enu.nextElement();
			System.out.println(paraName + ": " + request.getParameter(paraName));
		}
	}
	

	/**
	 * 在切入点前后切入内容,并自己控制何时执行切入点自身的内容
	 * 可以实现拦截器的功能
	 */
	@Around("log()")
	public Object doAround(ProceedingJoinPoint pjp){
		logger.info("LogAop.doAround()");
		try {
			return pjp.proceed();
		} catch (Throwable e) {
			logger.info("exception: ", e);
			throw new RuntimeException("unknown error");
		}
	}
	
	/**
	 * 用来处理当切入内容部分抛出异常之后的处理逻辑
	 */
	@AfterThrowing("log()")
	public void doAfterThrowing(){
		logger.info("LogAop.doAfterThrowing()");
	}
	
	/**
	 * 在切入点结尾处切入内容
	 */
	@After("log()")
	public void doAfter(JoinPoint joinPoint){
		logger.info("LogAop.doAfter()");
	}

	/**
	 * 在切入点return内容之后切入内容(可以用来对处理返回值做一些加工处理)
	 * @param joinPoint
	 */
	@AfterReturning("log()")
	public void doAfterReturning(JoinPoint joinPoint) {
		// 处理完请求,返回内容
		logger.info("LogAop.doAfterReturning()");
		logger.info("耗时(毫秒) : " + (System.currentTimeMillis() - startTime.get()));
	}
}
三,测试,HelloController
package com.example.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@RestController
public class HelloController {

	private Logger logger =  LoggerFactory.getLogger(this.getClass());
	
	@RequestMapping("/sayHello")
	public String sayHello(String name){
		logger.info("default info logging");
		logger.debug("dev debug logging");
		logger.error("prod error logging");
		return "Hello: "+name;
	}
	
	@RequestMapping("/hello")
	public String hello(){
		logger.info("=== hello world");
		return "Hello World";
	}
	
	@RequestMapping("/hello/error")
	public String helloError(){
		logger.info("=== hello world exception");
		int i = Integer.parseInt("a");
		return "Hello World";
	}
}

四,启动测试:

1,http://localhost:8088/spring-boot/hello

查看日志:

2017-04-11 09:31:47.023 DEBUG 7424 --- [nio-8088-exec-2] o.s.web.servlet.DispatcherServlet        : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/spring-boot/hello]
2017-04-11 09:31:47.024 DEBUG 7424 --- [nio-8088-exec-2] s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /hello
2017-04-11 09:31:47.024 DEBUG 7424 --- [nio-8088-exec-2] s.w.s.m.m.a.RequestMappingHandlerMapping : Returning handler method [public java.lang.String com.example.controller.HelloController.hello()]
2017-04-11 09:31:47.024 DEBUG 7424 --- [nio-8088-exec-2] o.s.web.servlet.DispatcherServlet        : Last-Modified value for [/spring-boot/hello] is: -1
2017-04-11 09:31:47.025  INFO 7424 --- [nio-8088-exec-2] com.example.aop.LogAop                   : LogAop.doAround()
2017-04-11 09:31:47.025  INFO 7424 --- [nio-8088-exec-2] com.example.aop.LogAop                   : LogAop.doBefore()
2017-04-11 09:31:47.025  INFO 7424 --- [nio-8088-exec-2] com.example.aop.LogAop                   : URL : http://localhost:8088/spring-boot/hello
2017-04-11 09:31:47.025  INFO 7424 --- [nio-8088-exec-2] com.example.aop.LogAop                   : HTTP_METHOD : GET
2017-04-11 09:31:47.025  INFO 7424 --- [nio-8088-exec-2] com.example.aop.LogAop                   : IP : 0:0:0:0:0:0:0:1
2017-04-11 09:31:47.025  INFO 7424 --- [nio-8088-exec-2] com.example.aop.LogAop                   : CLASS_METHOD : com.example.controller.HelloController.hello
2017-04-11 09:31:47.025  INFO 7424 --- [nio-8088-exec-2] com.example.aop.LogAop                   : ARGS : []
2017-04-11 09:31:47.026  INFO 7424 --- [nio-8088-exec-2] com.example.controller.HelloController   : === hello world
2017-04-11 09:31:47.026  INFO 7424 --- [nio-8088-exec-2] com.example.aop.LogAop                   : LogAop.doAfter()
2017-04-11 09:31:47.026  INFO 7424 --- [nio-8088-exec-2] com.example.aop.LogAop                   : LogAop.doAfterReturning()
2017-04-11 09:31:47.026  INFO 7424 --- [nio-8088-exec-2] com.example.aop.LogAop                   : 耗时(毫秒) : 1
2017-04-11 09:31:47.032 DEBUG 7424 --- [nio-8088-exec-2] m.m.a.RequestResponseBodyMethodProcessor : Written [Hello World] as "text/plain;charset=UTF-8" using [org.springframework.http.converter.StringHttpMessageConverter@32ea82a3]
2017-04-11 09:31:47.032 DEBUG 7424 --- [nio-8088-exec-2] o.s.web.servlet.DispatcherServlet        : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling
2017-04-11 09:31:47.033 DEBUG 7424 --- [nio-8088-exec-2] o.s.web.servlet.DispatcherServlet        : Successfully completed request

可以看到执行过程:doAround- doBefore - HelloController - doAfter - doAfterReturning

2,http://localhost:8088/spring-boot/hello/error

查看日志:

2017-04-11 09:37:04.329 DEBUG 5056 --- [nio-8088-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing servlet 'dispatcherServlet'
2017-04-11 09:37:04.331  INFO 5056 --- [nio-8088-exec-1] o.a.c.c.C.[.[localhost].[/spring-boot]   : Initializing Spring FrameworkServlet 'dispatcherServlet'
2017-04-11 09:37:04.331  INFO 5056 --- [nio-8088-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started
2017-04-11 09:37:04.331 DEBUG 5056 --- [nio-8088-exec-1] o.s.web.servlet.DispatcherServlet        : Using MultipartResolver [org.springframework.web.multipart.support.StandardServletMultipartResolver@19eb3a47]
2017-04-11 09:37:04.337 DEBUG 5056 --- [nio-8088-exec-1] o.s.web.servlet.DispatcherServlet        : Unable to locate LocaleResolver with name 'localeResolver': using default [org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver@790e82ac]
2017-04-11 09:37:04.344 DEBUG 5056 --- [nio-8088-exec-1] o.s.web.servlet.DispatcherServlet        : Unable to locate ThemeResolver with name 'themeResolver': using default [org.springframework.web.servlet.theme.FixedThemeResolver@94817cb]
2017-04-11 09:37:04.355 DEBUG 5056 --- [nio-8088-exec-1] o.s.web.servlet.DispatcherServlet        : Unable to locate RequestToViewNameTranslator with name 'viewNameTranslator': using default [org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator@71e76c10]
2017-04-11 09:37:04.365 DEBUG 5056 --- [nio-8088-exec-1] o.s.web.servlet.DispatcherServlet        : Unable to locate FlashMapManager with name 'flashMapManager': using default [org.springframework.web.servlet.support.SessionFlashMapManager@6db51401]
2017-04-11 09:37:04.366 DEBUG 5056 --- [nio-8088-exec-1] o.s.web.servlet.DispatcherServlet        : Published WebApplicationContext of servlet 'dispatcherServlet' as ServletContext attribute with name [org.springframework.web.servlet.FrameworkServlet.CONTEXT.dispatcherServlet]
2017-04-11 09:37:04.366  INFO 5056 --- [nio-8088-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 35 ms
2017-04-11 09:37:04.366 DEBUG 5056 --- [nio-8088-exec-1] o.s.web.servlet.DispatcherServlet        : Servlet 'dispatcherServlet' configured successfully
2017-04-11 09:37:04.392 DEBUG 5056 --- [nio-8088-exec-1] o.s.web.servlet.DispatcherServlet        : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/spring-boot/hello/error]
2017-04-11 09:37:04.399 DEBUG 5056 --- [nio-8088-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /hello/error
2017-04-11 09:37:04.402 DEBUG 5056 --- [nio-8088-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Returning handler method [public java.lang.String com.example.controller.HelloController.helloError()]
2017-04-11 09:37:04.404 DEBUG 5056 --- [nio-8088-exec-1] o.s.web.servlet.DispatcherServlet        : Last-Modified value for [/spring-boot/hello/error] is: -1
2017-04-11 09:37:04.435  INFO 5056 --- [nio-8088-exec-1] com.example.aop.LogAop                   : LogAop.doAround()
2017-04-11 09:37:04.435  INFO 5056 --- [nio-8088-exec-1] com.example.aop.LogAop                   : LogAop.doBefore()
2017-04-11 09:37:04.436  INFO 5056 --- [nio-8088-exec-1] com.example.aop.LogAop                   : URL : http://localhost:8088/spring-boot/hello/error
2017-04-11 09:37:04.436  INFO 5056 --- [nio-8088-exec-1] com.example.aop.LogAop                   : HTTP_METHOD : GET
2017-04-11 09:37:04.438  INFO 5056 --- [nio-8088-exec-1] com.example.aop.LogAop                   : IP : 0:0:0:0:0:0:0:1
2017-04-11 09:37:04.441  INFO 5056 --- [nio-8088-exec-1] com.example.aop.LogAop                   : CLASS_METHOD : com.example.controller.HelloController.helloError
2017-04-11 09:37:04.441  INFO 5056 --- [nio-8088-exec-1] com.example.aop.LogAop                   : ARGS : []
2017-04-11 09:37:04.452  INFO 5056 --- [nio-8088-exec-1] com.example.controller.HelloController   : === hello world exception
2017-04-11 09:37:04.457  INFO 5056 --- [nio-8088-exec-1] com.example.aop.LogAop                   : exception: 

java.lang.NumberFormatException: For input string: "a"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:580)
	at java.lang.Integer.parseInt(Integer.java:615)
	at com.example.controller.HelloController.helloError(HelloController.java:30)
	.............

2017-04-11 09:37:04.460  INFO 5056 --- [nio-8088-exec-1] com.example.aop.LogAop                   : LogAop.doAfter()
2017-04-11 09:37:04.460  INFO 5056 --- [nio-8088-exec-1] com.example.aop.LogAop                   : LogAop.doAfterThrowing()
2017-04-11 09:37:04.462 DEBUG 5056 --- [nio-8088-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolving exception from handler [public java.lang.String com.example.controller.HelloController.helloError()]: java.lang.RuntimeException: unknown error
2017-04-11 09:37:04.465 DEBUG 5056 --- [nio-8088-exec-1] .w.s.m.a.ResponseStatusExceptionResolver : Resolving exception from handler [public java.lang.String com.example.controller.HelloController.helloError()]: java.lang.RuntimeException: unknown error
2017-04-11 09:37:04.465 DEBUG 5056 --- [nio-8088-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolving exception from handler [public java.lang.String com.example.controller.HelloController.helloError()]: java.lang.RuntimeException: unknown error
2017-04-11 09:37:04.467 DEBUG 5056 --- [nio-8088-exec-1] o.s.web.servlet.DispatcherServlet        : Could not complete request

java.lang.RuntimeException: unknown error
	at com.example.aop.LogAop.doAround(LogAop.java:84)
	....................

2017-04-11 09:37:04.484 DEBUG 5056 --- [nio-8088-exec-1] o.s.web.servlet.DispatcherServlet        : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/spring-boot/error]
2017-04-11 09:37:04.486 DEBUG 5056 --- [nio-8088-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /error
2017-04-11 09:37:04.488 DEBUG 5056 --- [nio-8088-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Returning handler method [public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)]
2017-04-11 09:37:04.488 DEBUG 5056 --- [nio-8088-exec-1] o.s.web.servlet.DispatcherServlet        : Last-Modified value for [/spring-boot/error] is: -1
2017-04-11 09:37:04.588 DEBUG 5056 --- [nio-8088-exec-1] o.s.w.s.m.m.a.HttpEntityMethodProcessor  : Written [{timestamp=Tue Apr 11 09:37:04 CST 2017, status=500, error=Internal Server Error, exception=java.lang.RuntimeException, message=unknown error, path=/spring-boot/hello/error}] as "application/json;charset=UTF-8" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@47854de0]
2017-04-11 09:37:04.589 DEBUG 5056 --- [nio-8088-exec-1] o.s.web.servlet.DispatcherServlet        : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling
2017-04-11 09:37:04.591 DEBUG 5056 --- [nio-8088-exec-1] o.s.web.servlet.DispatcherServlet        : Successfully completed request
在HelloController中我们给定了一个异常,

可以看到执行过程:doAround- doBefore - HelloController - doAfter - doAfterThrowing

=====================================================================================================

这篇提到了异常,那么下篇我们来学习公共异常的处理:SpringBoot 学习记录(六): Exception



springboot—spring aop 实现系统操作日志记录存储到数据库 采用方案: 使用spring 的 aop 技术切到自定义注解上,针对不同注解标志进行参数解析,记录日志 缺点:要针对每个不同的注解标志进行分别取注解标志,获取参数进行日志记录输出 1. 需要引用的依赖 <!--spring切面aop依赖--> <dependency> <groupId>org.springframework.boot</g... 阅读详情

相关推荐

Python数据清洗实战:用RapidFuzz搞定模糊匹配(附完整代码示例)

本文详细介绍了在Python数据清洗中,如何利用RapidFuzz库高效解决字符模糊匹配难题。通过实战代码示例,演示了从处理拼写错误、格式不一致的脏数据,到构建实体对齐与记录去重的完整清洗管道,帮助开发者提升数据质量与处理效率。

pear55的博客 532

Java日志:log4j2

java日志框架、log4j2

a4453368的博客 1665

halcon 检测直线

图中后三个对象既是检测出的图像;

qq_59062726的博客 666

8.05 Day36----Spring两大核心模块

IOC&DI Inversion Of Control 控制反转(在运行时基于反射发现组件类和注册对象的过程) Dependency Injection 依赖注入(赋值的工程) 具有IoC功能的注解: 什么控制权? 为什么要反转? Component组件(组成工程的原件,指的是类) Bean/JavaBean 咖啡豆/组成(指的对象/被IoC容器发现后创建的对象) IoC&DI的实现方式有3种: 日志管理: 打印日志的规则: 日志级别: 设置日志规则: AOP: 建aop的依..

qq_63771774的博客 265

windows11下pycharm怎么完全卸载?完整卸载pycharm编辑器的教程

在卸载pycharm时都有遇到卸载不干净不完全的问题,那么具体怎样做才能完全卸载pycharm呢?退出所有的操作,重新启动电脑,会发现相关的软件已经被删除了。步骤1:卸载软件并删除安装目录。步骤2:删除相关的注册表。

拥抱具身智能,昇腾Ascend C 1万+

在 ABAP Cloud 里优雅读取与解析 XML:用 sXML Reader 把接口数据落成结构化 ABAP

ABAP Cloud中XML解析实践 摘要:本文介绍了在ABAP Cloud环境下解析XML数据的最佳实践。针对企业系统中常见的XML格式数据,文章推荐使用sXML库中的CL_SXML_STRING_READER进行流式解析,而非传统的DOM方式。重点解析了命名空间(Namespace)、属性(Attribute)和CDATA等关键概念的处理方法,并比较了两种读取属性的策略:通扫所有属性(NEXT_ATTRIBUTE)和精准取值(GET_ATTRIBUTE_VALUE)。文章提供了完整的ABAP Cloud

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 189

SpringBoot详解(四)-优雅地处理日志

SpringBoot详解系列文章:SpringBoot详解(一)-快速入门SpringBoot详解(二)-Spring Boot的核心SpringBoot详解(三)-Spring Boot的web开发SpringBoot详解(四)-优雅地处理日志 一、简介 日志功能在j2ee项目中是一个相当常见的功能,在一个小项目中或许你可以在一个个方法中,使用日志表的Mapper生成一条条的日志记录,但这无...

weixin_34015336的博客 534

深入解析基于Fluent的蒸发冷凝相变UDF程序及其在重力热管液体蒸发冷凝变化计算中的应用

ANSYS Fluent是一款功能强大的CFD软件,广泛应用于流体流动、传热、化学反应和多相流等领域的数值模拟。Fluent提供了丰富的物理模型和求解器,支持用户自定义函数(UDF)以扩展其功能,实现更为复杂和特定的模拟需求。UDF是用C语言编写的程序,允许用户在Fluent中自定义物理模型、边界条件、源项等,以实现特定的模拟需求。在处理复杂的相变过程、非均匀物性参数或特定的热传导机制时,UDF提供了极大的灵活性和扩展性。

qq_38334677的博客 1265

Log4j日志打印的两种写法

1. private Logger logger = LoggerFactory.getLogger(DictServiceImpl.class); private Logger logger = LoggerFactory.getLogger(DictController.class); 2.第二种写法================================ private Logger logger = LoggerFactory.getLogger(this.

weixin_61503139的博客 642

【深度学习】脸部修复,CodeFormer,论文,实战

Blind face restoration是一个高度 ill-posed 的问题,通常需要辅助引导来 1) 改善从降级输入到期望输出的映射,或者 2) 补充在输入中丢失的高质量细节。在本文中,我们展示了在一个小的代理空间中学到的离散码本先验可以通过将盲目的面部恢复建模为 a code prediction task来大大减少恢复映射的不确定性和模糊性,同时为生成高质量面部提供丰富的视觉元素。

q742971636的博客 2994

深度强化学习在机器人控制中的应用

非常感谢您提供如此详细的任务要求和约束条件。作为一位世界级的人工智能专家和计算机领域大师,我将全身心投入到这篇技术博客的撰写中。 深度强化学习在机器人控制中的应用 1. 背景介绍 近年来,随着人工智能技术的飞速发展,深度学习和强化学习在各个领域都得到了广泛应用,尤其是在机器人

AI天才研究院 1323

Spring Boot 日志管理

如果想要对日志的方方面面进行设定,Spring Boot 也支持自定义日志配置,如 logback 、 log4j。以 logback 为例,可以直接在 application.properties 文件中指定 logback 配置文件。# 指定logback配置文件,位于resources目录下在生产环境,我们希望指定日志保存的位置,另外日志不能无限制一直保存,一般情况下保存最近 30 天左右的日志即可。这些都可以在 logback-spring.xml 文件中指定。 ...

someday____的博客 948

基于STM32的汽车主门电动窗开关系统设计方案

以下是基于 STM32CubeMX 和 HAL 库的示例代码,可实现基本的功能。

weixin_42300449的博客 995

Spring-boot-demo学习记录(五)-spring-boot 日志持久化之AOP方式+Logback方式

目录 前言 一、要实现的demo? 二、实现步骤 1.新建模块 2.代码编写 总结 前言 此系列博客是个人在学习springBoot的学习笔记,算是一个记录吧,一方面记录学习的内容,一方面记录学习中犯下的错误。学习springBoot选择的是GitHub上一个比较著名的项目,链接如下https://github.com/xkcoding/spring-boot-demo.git。这是一个从易到难的项目,目标:完成本地实现。技术差,文笔差,学习能力差,啥都差,欢迎...

qq_31374621的博客 706

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【SpringBoot】SpringBoot中使用AOP实现日志记录功能

AOP的全称是Aspect-Oriented Programming,即面向切面编程(也称面向方面编程)。它是面向对象编程(OOP)的一种补充,目前已成为一种比较成熟的编程方式。在传统的业务处理代码中,通常都会进行事务处理、日志记录等操作。虽然使用OOP可以通过组合或者继承的方式来达到代码的重用,但如果要实现某个功能(如日志记录),同样的代码仍然会分散到各个方法中。这样,如果想要关闭某个功能,或者对其进行修改,就必须要修改所有的相关方法。这不但增加了开发人员的工作量,而且提高了代码的出错率。

qq_61024956的博客 5970

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

SpringBoot使用AOP记录接口操作日志

前言:我们项目中可能有这种需求,每个人请求了哪些接口?做了什么事情?参数是什么?重要的接口我们需要记日志以便查找。我们不可能在每个接口中去一一处理,可以借助Spring提供的AOP能力+自定义注解轻松应对。 ...

何哥的博客 2万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

SpringBoot系列:通过AOP+注解优雅实现操作日志记录

在企业应用开发中,操作日志记录是确保系统安全性、可追溯性以及调试分析的重要手段之一。通过记录用户的操作行为,不仅可以帮助开发者快速定位问题,还能满足审计和合规需求。本文旨在探讨如何在SpringBoot应用程序中通过AOP(面向切面编程)和自定义注解实现操作日志记录,并将日志存储到数据库中。我们将详细介绍实现这一功能的完整流程,包括项目环境搭建、数据库设计、代码实现及测试验证等步骤。操作日志在企业应用中扮演着至关重要的角色。

weixin_73588491的博客 1万+

【Springboot】基于AOP实现操作日志记录

基于AOP实现springboot项目中中的操作日志记录功能

ASL2915的博客 2681

SpringBoot+AOP实现用户操作日志的记录

任何一个项目都会有一个用户操作日志(也叫行为日志)的模块,它主要用来记录某个用户做了某个操作,当出现操作失败时,通过日志就可以快速的查找是哪个用户在哪个模块出现了错误,以便于开发人员快速定位问题所在。

祖哥的博客 9559

SpringBoot中使用AOP实现日志记录功能

日志记录在软件开发中是极其重要的,能够帮助开发人员快速定位问题、监控系统性能、提高系统安全性、跟踪业务流程等,是保障系统稳定运行和快速问题排查的重要手段

customer08的博客 1816

使用SpringBoot AOP记录操作日志和异常日志

使用SpringBoot AOP记录操作日志和异常日志

YIYIYI 3002

SpringBoot AOP 记录操作日志、异常日志

使用SpringBoot AOP 记录操作日志、异常日志 我们在做项目时经常需要对一些重要功能操作记录日志,方便以后跟踪是谁在操作此功能。在操作某些功能时也有可能会发生异常,但是每次发生异常要定位原因都要到服务器去查询日志才能找到,这样也不能对发生的异常进行统计。我们可以在需要的方法中增加记录日志的代码,和在每个方法中增加记录异常的代码,最终把记录的日志存到数据库中。 Spring AOP 的主要功能就是将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来。今天我们就来用spri

默存 8787

springboot使用aop记录日志

Springboot中添加AOP日志,对你会有帮助!

weixin_45541795的博客 4062

Java实战:Spring Boot实现AOP记录操作日志

本文将详细介绍如何在Spring Boot应用程序中使用Aspect Oriented Programming(AOP)来实现记录操作日志的功能

oandy0的博客 3491
上一篇: SpringBoot 学习记录(四): slf4j+logback
下一篇: SpringBoot 学习记录(六): Exception
小小小爬虫
博客等级 码龄10年 16粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值