日志是我们排查线上问题的主要手段,对于线上的访问性能统计等通常也会通过AOP方式统计方法耗时情况。最近项目中碰到了一个问题,一个用log4j的老项目增加性能统计日志,做法都很通用:
拦截日志的切面定义如下:
@Component @Aspect public class TimeLogIntercept { private final Logger logger = LoggerFactory.getLogger(TimeLogIntercept.class); /** * 所有serviceClass的类的所有public方法 */ @Pointcut("execution(public * com.test..*ServiceImpl.*(..))") public void serviceClass() { } /** * 所有serviceClass的类的所有public方法 */ @Pointcut("execution(public * com.test..*Dao.*(..))") public void daoClass() { } /** * 所有controller的类的所有public方法 */ @Pointcut("execution(public * com.test.web..*Controller.*(..))") public void controllerClass() { } @Around("serviceClass() || daoClass() || controllerClass()") public Object around(ProceedingJoinPoint pjp) throws Throwable { Long startTime = 0L; String methodName = ""; try { startTime = System.currentTimeMillis(); MethodSignature joinPointObject = (MethodSignature) pjp.getSignature(); Method method = joinPointObject.getMethod(); methodName = pjp.getTarget().getClass().getName(); methodName = methodName + "." + method.getName(); Object proceed = pjp.proceed(); return proceed; } finally { Long endTime = System.currentTimeMillis(); long time = endTime - startTime; if (time > 1000) { logger.warn(" cost time:" + time + "ms." + "methodName is ->" + methodName); }
logger.warn(" cost time:" + time + "ms." + "methodName is ->" + methodName);
} } } log4j的配置如下:
# performanceFilter log4j.appender.PA=org.apache.log4j.DailyRollingFileAppender log4j.appender.PA.file=../logs/wf_server_performance.log log4j.appender.PA.DatePattern='.'yyyy-MM-dd log4j.appender.PA.layout=org.apache.log4j.PatternLayout log4j.appender.PA.layout.ConversionPattern=[%p]\t%d\t[%t]\t%c{3}\t(%F\:%L)\t-%m%n log4j.appender.PA.bufferSize=10000 log4j.logger.com.test.TimeLogInterceptor (1)Logger对象有问题应该用log4j的Logger对象,正确方法是 Logger log = Logger.getLogger(TimeLogInterceptor.class); 改了上面之后,发现还是不打印日志,那应该问题出在AOP上面 检查Spring配置发现确认AOP配置有问题,原来的老项目配置并没有用AOP切面,所以增加了切面相关的配置:增加schema文件声明: xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd" 还需要增加:
<aop:aspectj-autoproxy />
测试后发现日志终于可以正常输出了,解决问题!
相关推荐
在实现AOP拦截日志时,我们可以定义一个切点,该切点匹配我们想要记录日志的方法。例如,我们可以使用`@Pointcut`注解来定义一个匹配所有控制器类中所有方法的切点: ```java @Pointcut("execution(* ...
本节将详细介绍如何使用Spring AOP实现流程日志跟踪,主要关注于如何通过AOP拦截特定的类和方法来进行日志记录。 ##### 3.1 配置Spring AOP 在Spring配置文件中定义切面和切入点表达式是非常关键的一步。一般来说...
SpringBoot结合AspectJ实现SpringAOP拦截指定方法的知识点涵盖了多个方面,这包括Spring AOP的基本概念、SpringBoot的应用、切点(Pointcut)与通知(Advice)的定义、自定义注解以及AspectJ的使用。以下是这些知识...
通过这种方式,我们可以在Spring MVC中利用AOP实现对Controller方法的透明日志管理,不仅记录正常流程,也能捕获和记录异常,提升系统的可维护性和问题排查效率。 在实际项目中,我们可以根据需求进一步定制日志...
"springaop拦截controller日志"这个主题旨在讲解如何使用Spring AOP来拦截Controller层的方法调用,并在方法执行前后记录相关日志。 首先,了解Spring AOP的基本概念。AOP是一种编程范式,它允许程序员定义“切面”...
在Spring AOP(面向切面编程)中,我们可以通过定义拦截器来实现对系统操作日志和异常日志的记录,这些日志信息通常会被存储到数据库中以便于后续的分析和故障排查。下面将详细介绍如何使用Spring AOP实现这个功能。...
这个“spring AOP拦截方法小示例”是一个实际应用,展示了如何使用Spring AOP来拦截特定层的所有方法,并在调用前后以及出现异常时执行自定义逻辑。 首先,让我们了解AOP的基本概念。AOP的核心是切面(Aspect),它...
当通过代理调用方法时,拦截器的`Intercept`方法会被自动调用,从而实现AOP的功能。 总结来说,.NET的动态代理AOP拦截通过Castle.DynamicProxy库,使开发者能够方便地在运行时为对象创建代理,插入拦截逻辑,实现如...
AOP不生效的问题通常涉及多个方面,需要从配置、代理模式选择、类管理等多个角度进行排查。本篇文章提供了较为全面的解决方案,希望能帮助开发者快速定位并解决问题。在实际开发中,还需要结合具体情况灵活应用这些...
它们可能包含模拟业务场景的方法,这些方法会被切面拦截并执行相应的通知。通过运行这些测试,我们可以确保AOP配置正确无误,拦截器按预期工作。 总的来说,Spring AOP是一种强大的工具,能帮助我们解耦系统中的...
在Spring MVC框架中,AOP(面向切面编程)是一种强大的工具,用于实现日志拦截,特别是对于controller层的操作。AOP允许我们定义横切关注点,这些关注点可以是如日志记录、事务管理、权限检查等通用功能,它们在程序...
// 获取被拦截方法的简单名称 String methodName = joinPoint.getSignature().getName(); // 记录方法开始信息 logger.info("开始执行方法:" + methodName); // 调用被拦截的方法 Object result = ...
在Spring Boot应用中,Spring AOP(面向切面编程)是一种强大的工具,它允许我们创建横切关注点,如日志记录、权限检查等,这些关注点可以被编织到应用程序的多个点上,而无需侵入核心业务逻辑。在本案例中,我们将...
当我们想通过注解方式拦截Controller层的方法时,可能会遇到一些问题。本文将详细介绍如何使用AspectJ注解在Spring MVC中实现AOP拦截Controller方法,并提供一个具体的例子。 首先,我们需要了解Spring AOP的基础...
4. 日志拦截器:在Java中,日志拦截器通常是指通过AOP来实现的对特定方法调用进行日志记录的机制。它可以在方法执行前、执行后或异常时插入日志打印,帮助开发者跟踪程序运行状态,尤其在多线程和复杂业务逻辑中非常...
AOP是一种编程范式,它允许程序员定义“切面”,这些切面可以封装关注点,如日志、事务管理、性能监控等,与业务逻辑解耦。要使用Spring的AOP功能,我们需要引入特定的库,这正是标题中提到的"Spring使用AOP的三个...
通过对这个简单的AOP拦截器实现的学习,我们可以进一步探索如何结合注解驱动的AOP、环绕通知(`Around Advice`)、代理模式的实现细节、以及如何在实际项目中利用AOP解决实际问题。AOP是Spring框架的强大工具,理解...
Spring AOP允许我们在不修改业务代码的情况下,对方法执行前、执行后、异常发生时等不同阶段添加额外的行为。在Spring Boot中,我们可以定义一个切面(Aspect)类,使用`@Aspect`注解,然后定义一个切入点表达式...
在Java开发中,AOP(面向切面编程)是一种强大的设计模式,它允许程序员将关注点从业务逻辑中分离出来,比如日志记录、事务...在实际项目中,结合Spring AOP进行日志记录能够大大提高开发效率,同时也方便了问题排查。