`
yuri_liuyu
  • 浏览: 177912 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于用aop方式记录日志

阅读更多

最近需要开始剥离日志逻辑,故想到了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
分享到:
评论

相关推荐

    j2ee的aop方式记录日志

    在日志切面中,通过这些库的API记录日志信息。 - 根据需求,可以记录方法名、参数、返回值、执行时间、用户信息和请求信息等。 5. **优化与注意事项** - 注意日志级别,根据不同的环境(开发、测试、生产)设置...

    AOP的例子 记录日志

    在本例子中,我们将探讨如何使用Spring框架实现AOP来记录日志。 **一、AOP概念** AOP(Aspect Oriented Programming)的核心是切面(Aspect),它将分散在多个对象中的共同行为(如日志、异常处理)抽象出来,形成...

    利用 spring annotation AOP 反射 记录日志

    总之,Spring的注解AOP和反射机制为我们提供了一种灵活、便捷的方式来记录日志。通过定义切面、切入点和通知,我们可以轻松地跟踪和监控应用程序的行为,这对于调试和性能分析非常有用。同时,理解并掌握这些技术,...

    spring aop 操作日志

    本资源用来展示如何使用 spring aop 进行日志记录,例子里面通过aop的配置,把产生的日志存放到当前项目的根目录下,而且对方法执行过程中的参数进行了记录,对于aop如何记录日志不清楚的同学可以看看。

    struts aop日志系统

    struts aop日志系统,struts aop日志系统

    spring aop 自定义注解保存操作日志到mysql数据库 源码

    4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑实现 (需要知道原理的请看spring aop源码,此处不做赘述) 3、...

    SpringBoot使用AOP注解记录操作日志

    // 从事件中获取请求信息,记录日志 // event.getException() 获取异常信息 // event.getRequest() 获取HttpServletRequest对象,从中获取IP、请求参数等 } } ``` 在这个监听器中,我们可以捕获到处理失败的...

    Spring AOP实战 记录日志 下载可以直接使用

    使用场景及目标: 在生产环境中,通过巧妙的AOP机制,实现对日志的细致记录和处理。我们的目标是提高日志记录的效率和规范性,为监控和故障排查提供更为轻松便捷的工具。 其他说明: 这一方法极为便捷,不仅简化了...

    Spring aop 记录操作日志 Aspect 源码

    总之,Spring AOP提供了一种优雅的方式来实现记录操作日志的需求,通过自定义Aspect和注解,我们可以灵活地控制哪些方法需要记录日志,以及记录什么样的日志信息。这个过程既提高了代码的可维护性,也使得日志管理...

    spring AOP 切面日志 分层打日志

    在本例中,我们可能会使用`@Around`来包围方法执行,以便在方法调用前后记录日志。 3. **定义切入点**: 使用`@Pointcut`定义切入点表达式,匹配我们需要日志记录的方法。例如,我们可以根据方法的名称或所在的包来...

    spring aop实现日志功能

    - 在通知方法中,你可以使用标准的日志库如log4j、logback或Java内置的日志API(java.util.logging.Logger)来记录日志。通常,日志应包含方法名、参数、执行时间、返回值(如果适用)以及任何异常信息。 5. **...

    Spring mvc mybatis plus 实现AOP 切面日志系统

    本项目利用AOP实现切面日志系统,可以在关键操作执行前后自动记录日志,提高代码的可维护性和可扩展性。 在具体实现上,开发者可能创建了一个`@Aspect`注解的切面类,其中包含一个或多个`@Pointcut`定义的切入点...

    Spring AOP--日志管理

    在IT行业中,Spring框架是Java开发中的核心工具之一,它为开发者提供了许多强大的功能...在提供的"aopLog-demo"项目中,你可以找到更多关于Spring AOP日志管理的实际应用示例,这将有助于你进一步理解和实践这一技术。

    swagger和spring Aop日志结合

    6. 结合Swagger UI:Swagger UI可以展示API文档,同时,通过AOP记录的日志可以在后台系统中查看,以便分析API的使用情况。 通过这种方式,我们可以实现对Swagger定义的API的全面日志跟踪,为API的调试、性能优化和...

    SpringBoot+AOP日志

    在日志管理的切面中,可能会使用`@Pointcut`定义切入点表达式,匹配需要记录日志的方法,然后在通知中编写日志记录代码。 综上所述,"SpringBoot+AOP日志"项目利用了Spring Boot的便利性、MyBatis的数据库操作能力...

    JAVA 中Spring aop 实现日志记载

    例如,`@Before`会在方法执行前记录日志,`@AfterReturning`则在方法成功返回后记录日志。 ```java @Component @Aspect public class LoggingAspect { @Before("serviceMethods()") public void logBefore...

    Spring之AOP在鉴权和日志记录中的应用

    Spring AOP通过提供非侵入式的方式,使得我们可以方便地实现鉴权和日志记录等跨切面关注点,提高了代码的可维护性和复用性。理解并熟练运用Spring AOP,有助于构建更加健壮、灵活的系统。在实际项目中,应根据业务...

    spring boot aop 统一处理日志

    在Spring Boot应用中,AOP(面向切面编程)是一种强大的工具,用于实现代码的解耦和模块化,尤其适用于处理横切关注点,如日志记录、事务管理、安全控制等。本教程将深入探讨如何利用Spring Boot的AOP特性来实现日志...

Global site tag (gtag.js) - Google Analytics