最近需要开始剥离日志逻辑,故想到了aop方式插入日志。
配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<aop:config>
<aop:advisor id="serviceLog" advice-ref="methodTimeAdvice" pointcut="execution(* *..service..*(..))" />
<aop:advisor id="daoLog" advice-ref="methodTimeAdvice" pointcut="execution(* *..dao..*(..))" />
</aop:config>
<bean id="methodTimeAdvice" class="com.cms5.cmservice.jms.monitor.log.MethodTimeAdvice" />
</beans>
补充一点:如果在pointcut中存在多个表达式,可以用"||"来进行分隔,如:
<aop:config>
<aop:advisor id="jmsLog" advice-ref="methodTimeAdvice"
pointcut="execution(* *..dao.impl..*(..))||execution(* *..service.impl..*(..))||execution(* *..front.impl..*(..))" />
</aop:config>
实际执行日志插入的类代码:
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.StopWatch;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class MethodTimeAdvice implements MethodInterceptor {
protected final Log log = LogFactory.getLog(MethodTimeAdvice.class);
/**
* 拦截要执行的目标方法
*/
@SuppressWarnings("unchecked")
public Object invoke(MethodInvocation invocation) throws Throwable {
StopWatch clock = new StopWatch();
clock.start(); // 计时开始
Object result = invocation.proceed();
clock.stop(); // 计时结束
Class[] paramsType = invocation.getMethod().getParameterTypes();
Object[] params = invocation.getArguments();
String[] simpleParams = new String[paramsType.length];
String[] paramsStr = new String[params.length];
for (int i = 0; i < paramsType.length; i++) {
simpleParams[i] = paramsType[i].getSimpleName();
}
for (int i = 0; i < params.length; i++) {
paramsStr[i] = params[i].toString();
}
log.info("METHOD:["
+ invocation.getThis().getClass().getName() + "."
+ invocation.getMethod().getName() + "("
+ StringUtils.join(simpleParams, ",") + ")]<|>" + "PARAMS: "
+ StringUtils.join(paramsStr, ",") + "<|>" + "TAKES: "
+ clock.getTime() + " ms");
return result;
}
}
主要将service层和dao层的方法信息和参数情况还有方法执行时间打印出来。下面还要进一步在logback中配置用jms来将打出的日志已消息的形式发出,供消费者接受并集中计算,这个下次再发~
开发过程中遇到一个问题,就是项目中的dao层都采用了继承带泛型类的方式,在用cglib做动态代理的时候总是报错,所以在<aop:config>中将原来的 proxy-target-class="true"的配置去掉了(当然也要满足dao层的实现类实现了一个dao接口才行,开始的代码也是上网找的,后来查了下,才将这个配置去掉了,留在这里,作为备忘)
运行测试结果:
METHOD:[com.cms5.cmsservice.jms.monitor.dao.impl.JmsMonitorDaoImpl.countByCondition(JmsMonitorPo)]<|>PARAMS: JmsMonitorPo [biz_type=null, error_message_cms_end=null, error_message_product_end=null, error_message_rate_end=null, error_message_receive_end=null, error_time_cms_end=null, error_time_product_end=null, error_time_rate_end=null, error_time_receive_end=null, id=null, is_again=null, mdmc_id=null, mdmc_music_id=null, operate_type=null, state=null, state_cms_begin=null, state_cms_end=null, state_product_begin=null, state_product_end=null, state_rate_begin=null, state_rate_end=null, state_receive_begin=null, state_receive_end=null, success_time_cms_end=null, success_time_product_end=null, success_time_rate_end=null, success_time_receive_end=null, time_cms_begin=null, time_product_begin=null, time_rate_begin=null, time_receive_begin=null, version=null]<|>TAKES: 3609 ms
METHOD:[com.cms5.cmsservice.jms.monitor.dao.impl.JmsMonitorDaoImpl.queryByCondition(int,int,JmsMonitorPo)]<|>PARAMS: 0,20,JmsMonitorPo [biz_type=null, error_message_cms_end=null, error_message_product_end=null, error_message_rate_end=null, error_message_receive_end=null, error_time_cms_end=null, error_time_product_end=null, error_time_rate_end=null, error_time_receive_end=null, id=null, is_again=null, mdmc_id=null, mdmc_music_id=null, operate_type=null, state=null, state_cms_begin=null, state_cms_end=null, state_product_begin=null, state_product_end=null, state_rate_begin=null, state_rate_end=null, state_receive_begin=null, state_receive_end=null, success_time_cms_end=null, success_time_product_end=null, success_time_rate_end=null, success_time_receive_end=null, time_cms_begin=null, time_product_begin=null, time_rate_begin=null, time_receive_begin=null, version=null]<|>TAKES: 625 ms
METHOD:[com.cms5.cmsservice.jms.monitor.service.impl.JmsMonitorServiceImpl.getPageDatas(int,int,JmsMonitorPo)]<|>PARAMS: 1,20,JmsMonitorPo [biz_type=null, error_message_cms_end=null, error_message_product_end=null, error_message_rate_end=null, error_message_receive_end=null, error_time_cms_end=null, error_time_product_end=null, error_time_rate_end=null, error_time_receive_end=null, id=null, is_again=null, mdmc_id=null, mdmc_music_id=null, operate_type=null, state=null, state_cms_begin=null, state_cms_end=null, state_product_begin=null, state_product_end=null, state_rate_begin=null, state_rate_end=null, state_receive_begin=null, state_receive_end=null, success_time_cms_end=null, success_time_product_end=null, success_time_rate_end=null, success_time_receive_end=null, time_cms_begin=null, time_product_begin=null, time_rate_begin=null, time_receive_begin=null, version=null]<|>TAKES: 4250 ms
分享到:
相关推荐
在日志切面中,通过这些库的API记录日志信息。 - 根据需求,可以记录方法名、参数、返回值、执行时间、用户信息和请求信息等。 5. **优化与注意事项** - 注意日志级别,根据不同的环境(开发、测试、生产)设置...
在本例子中,我们将探讨如何使用Spring框架实现AOP来记录日志。 **一、AOP概念** AOP(Aspect Oriented Programming)的核心是切面(Aspect),它将分散在多个对象中的共同行为(如日志、异常处理)抽象出来,形成...
总之,Spring的注解AOP和反射机制为我们提供了一种灵活、便捷的方式来记录日志。通过定义切面、切入点和通知,我们可以轻松地跟踪和监控应用程序的行为,这对于调试和性能分析非常有用。同时,理解并掌握这些技术,...
本资源用来展示如何使用 spring aop 进行日志记录,例子里面通过aop的配置,把产生的日志存放到当前项目的根目录下,而且对方法执行过程中的参数进行了记录,对于aop如何记录日志不清楚的同学可以看看。
struts aop日志系统,struts aop日志系统
4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑实现 (需要知道原理的请看spring aop源码,此处不做赘述) 3、...
// 从事件中获取请求信息,记录日志 // event.getException() 获取异常信息 // event.getRequest() 获取HttpServletRequest对象,从中获取IP、请求参数等 } } ``` 在这个监听器中,我们可以捕获到处理失败的...
使用场景及目标: 在生产环境中,通过巧妙的AOP机制,实现对日志的细致记录和处理。我们的目标是提高日志记录的效率和规范性,为监控和故障排查提供更为轻松便捷的工具。 其他说明: 这一方法极为便捷,不仅简化了...
总之,Spring AOP提供了一种优雅的方式来实现记录操作日志的需求,通过自定义Aspect和注解,我们可以灵活地控制哪些方法需要记录日志,以及记录什么样的日志信息。这个过程既提高了代码的可维护性,也使得日志管理...
在本例中,我们可能会使用`@Around`来包围方法执行,以便在方法调用前后记录日志。 3. **定义切入点**: 使用`@Pointcut`定义切入点表达式,匹配我们需要日志记录的方法。例如,我们可以根据方法的名称或所在的包来...
- 在通知方法中,你可以使用标准的日志库如log4j、logback或Java内置的日志API(java.util.logging.Logger)来记录日志。通常,日志应包含方法名、参数、执行时间、返回值(如果适用)以及任何异常信息。 5. **...
本项目利用AOP实现切面日志系统,可以在关键操作执行前后自动记录日志,提高代码的可维护性和可扩展性。 在具体实现上,开发者可能创建了一个`@Aspect`注解的切面类,其中包含一个或多个`@Pointcut`定义的切入点...
在IT行业中,Spring框架是Java开发中的核心工具之一,它为开发者提供了许多强大的功能...在提供的"aopLog-demo"项目中,你可以找到更多关于Spring AOP日志管理的实际应用示例,这将有助于你进一步理解和实践这一技术。
6. 结合Swagger UI:Swagger UI可以展示API文档,同时,通过AOP记录的日志可以在后台系统中查看,以便分析API的使用情况。 通过这种方式,我们可以实现对Swagger定义的API的全面日志跟踪,为API的调试、性能优化和...
在日志管理的切面中,可能会使用`@Pointcut`定义切入点表达式,匹配需要记录日志的方法,然后在通知中编写日志记录代码。 综上所述,"SpringBoot+AOP日志"项目利用了Spring Boot的便利性、MyBatis的数据库操作能力...
例如,`@Before`会在方法执行前记录日志,`@AfterReturning`则在方法成功返回后记录日志。 ```java @Component @Aspect public class LoggingAspect { @Before("serviceMethods()") public void logBefore...
Spring AOP通过提供非侵入式的方式,使得我们可以方便地实现鉴权和日志记录等跨切面关注点,提高了代码的可维护性和复用性。理解并熟练运用Spring AOP,有助于构建更加健壮、灵活的系统。在实际项目中,应根据业务...
在Spring Boot应用中,AOP(面向切面编程)是一种强大的工具,用于实现代码的解耦和模块化,尤其适用于处理横切关注点,如日志记录、事务管理、安全控制等。本教程将深入探讨如何利用Spring Boot的AOP特性来实现日志...