`
willvvv
  • 浏览: 331550 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

使用Spring3.0的AOP结合log4j实现接口方法执行时间记录

阅读更多

项目使用RPC提供的内部服务,需要监控每个接口方法的调用情况以及响应时间,如果接口方法开始和结束时都计时并将两个时间相减得到响应时间,势必对代码的入侵太大。使用AOP刚好能很优雅的解决这个问题!

 

1.log4j的配置log4j.xml。这里使用xml风格的配置

	<appender name="info-out" class="org.apache.log4j.DailyRollingFileAppender">
		<param name="File" value="/data/logs/hiluo-service/info.log" />
		<param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%d{yyyy.MM.dd HH:mm:ss} [%C{1}:%M] %m%n" />
		</layout>
		<filter class="org.apache.log4j.varia.LevelRangeFilter">
			<param name="LevelMax" value="info" />
			<param name="LevelMin" value="info" />
			<param name="AcceptOnMatch" value="true" />
		</filter>
	</appender> 

log4j的配置参见:http://stonexmx.blog.163.com/blog/static/1221585872009716112428738/

PatternLayout输出格式参见:http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html

value="%d{yyyy.MM.dd HH:mm:ss} [%C{1}:%M] %m%n",%C{1}-类名,如果使用%C将输出类的全路径名,%M-方法名

输出类似以下内容:


 

 

2.MethodTimeAdvice.java 用来记录时间

 

package yourpackage.utils;

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.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MethodTimeAdvice implements MethodInterceptor {

	private static final Logger Log = LoggerFactory
			.getLogger(MethodTimeAdvice.class);

	@Override
	public Object invoke(MethodInvocation invocation) throws Throwable {
		// 用 commons-lang 提供的 StopWatch 计时
		StopWatch clock = new StopWatch();
		clock.start(); // 计时开始
		Object result = invocation.proceed();
		clock.stop(); // 计时结束

		// 方法参数类型,转换成简单类型
		Class[] params = invocation.getMethod().getParameterTypes();
		String[] simpleParams = new String[params.length];
		for (int i = 0; i < params.length; i++) {
			simpleParams[i] = params[i].getSimpleName();
		}
		Object[] args = invocation.getArguments();

		Log.info("Takes:" + clock.getTime() + " ms ["
				+ invocation.getThis().getClass().getName() + "."
				+ invocation.getMethod().getName() + "("
				+ StringUtils.join(simpleParams, ",") + ")("
				+ StringUtils.join(args, ",") + ")] ");
		return result;
	}

}

 

3.applicationContext.xml

 

<?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:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
	default-lazy-init="true">
        <aop:aspectj-autoproxy />
	<bean id="methodTimeAdvice" class="cn.hiluo.openfire.utils.MethodTimeAdvice" />
	<aop:config>
		<!-- 用 AspectJ 的语法定义 Pointcut,这里拦截 service 包中的所有方法 -->
		<aop:advisor id="methodTimeLog" advice-ref="methodTimeAdvice"
			pointcut="execution(* yourpackage.service.impl..*.*(..))" />
	</aop:config>
        <bean id="yourservice" class="**.impl.yourServiceImpl">
		
	</bean>
        。。。。。yourbeans
</beans>

 

4.注意需要加入Spring相关包,比较容易遗漏的:org.springframework.aop-3.0.6.RELEASE.jar,org.springframework.aspects-3.0.6.RELEASE.jar,aspectjweaver-1.5.3.jar,aopalliance-1.0.jar

 

5.applicationContext.xml注意xml中和AOP相关的dtd的引入,还要注意pointcut="execution(* yourpackage.service.impl..*.*(..))" 的配置语法

 

6.最后在info.log里面可以看到如上图的输出,最后再用shell统计即可。

 

参考:

http://jportal.iteye.com/blog/945725

 

http://www.java63.com/spring/configure_implement_aop.html

 

因为对spring的aop不是很熟,在实现上有细节问题,在此记录下!

  • 大小: 2.2 KB
分享到:
评论

相关推荐

    spring 3.0 aop 实例

    通过以上知识,我们可以创建一个简单的Spring AOP实例,例如创建一个日志切面,记录每个服务方法的执行时间: ```java @Aspect @Component public class LoggingAspect { @Before("execution(* ...

    spring3.0 + jpa 需要的jar包

    9. **com.springsource.org.apache.log4j-1.2.15.jar**:Log4j是Java日志记录框架,Spring和Hibernate都可能用到它进行日志输出。 10. **spring-jdbc-3.0.1.RELEASE.jar**:Spring JDBC模块提供了一个抽象层,简化...

    spring3.0企业版第二章运行所需要的jar包集合

    还有可能包括一些日志库,如log4j或slf4j,用于记录应用程序的运行信息。 总之,这个"spring3.0企业版第二章运行所需要的jar包集合"涵盖了Spring框架、JSTL和JDBC等关键组件,对于理解和实践Spring 3.0的企业级应用...

    spring3.0 源码

    Spring 3.0 是一个重要的Java应用程序框架,它极大地简化了企业级应用的开发过程。这个源码包包含了Spring框架的核心部分以及相关的项目,对于理解Spring的工作原理、学习如何实现自己的扩展或者进行性能优化有着极...

    spring3_junit4.10_log4j

    描述中提到,Spring 3.0需要JUnit 4.5以上的版本,而JUnit 4.10在实际应用中表现良好,同时也使用了Log4j进行日志记录。这些标签 "spring3", "junit4.10", "log4j" 和 "jar" 提供了关键组件的信息,表明这是一个Java...

    Spring3.0 相关包,资料

    Apache Commons Logging是一个轻量级的日志记录抽象层,允许开发人员在不修改代码的情况下,切换不同的日志实现,如Log4j、Java Util Logging等。Spring框架广泛使用了Commons Logging来进行日志记录,这样开发者...

    Spring 3.0 API

    此外,还讨论了Spring框架对日志的支持,包括不使用Commons Logging、使用SLF4J和使用Log4J。 随着Spring 3.0的更新,带来了许多新特性和增强功能。文档详细介绍了Java 5的支持,以及文档的改进,新文章和教程的...

    spring-aop标签和配置文件两种方式实例

    本实例将探讨如何在Spring中使用XML配置文件和AOP标签来实现这一功能,特别是针对Spring 2.5及以上版本。 首先,我们来看XML配置文件方式。在Spring中,AOP可以通过`&lt;aop:config&gt;`标签来配置。下面是一个基本的AOP...

    junit-4.10.jar,spring3,log4

    在Spring框架中,可以通过配置log4j.properties或log4j.xml文件来定制日志行为,与Spring的其他组件整合,实现统一的日志管理。 在提供的文件列表中,`spring-framework-3.0.0.RC3`是Spring框架3.0的Release ...

    spring framework reference 3.0

    - **使用 Log4J**:Log4J 是一个成熟的日志框架,被广泛使用。Spring 提供了对 Log4J 的集成支持。 #### II. Spring 3.0 新特性 ##### 2. 新特性与增强功能 - **Java 5 支持**:Spring 3.0 版本全面升级支持 ...

    spring3.0注解

    Spring 3.0的AOP支持允许开发者定义切面,实现如日志记录、权限控制等功能。使用@Aspect、@Before、@After等注解可以定义切点和通知,实现代码的解耦。例如,创建一个简单的日志切面: ```java @Aspect @...

    Struts2.1.8+Hibernate3.3+Spring3.0整合所需Jar包

    这些Jar包通常包括框架本身、其依赖库、以及可能需要的其他库,如数据库驱动、Log4j等。开发者需要根据实际项目需求来筛选和添加这些Jar包。 整合SSH涉及到的主要步骤有: 1. 配置Struts2的核心过滤器,指定相应的...

    SpringMVC3.0-Jar全量包含cglib几个包-aop的aspectj几个包

    8. **common-logging**:这是一个轻量级的日志抽象层,允许开发者选择不同的日志实现,如Log4j、java.util.logging或commons-logging自身。Spring使用它来记录框架内部的信息,方便开发者调整日志级别和选择合适的...

    Struts2 Spring3.0 Hibernate3.3 整合全注解配置用的数据库

    Spring3.0作为一款全面的轻量级企业级应用框架,不仅提供了依赖注入(DI)和面向切面编程(AOP),还支持事务管理、数据访问等。在全注解配置中,我们可以使用`@Component`、`@Service`、`@Repository`和`@...

    Spring AOP 简单demo

    Spring 3.0以后,我们可以使用`@AspectJ`注解驱动的AOP,这样可以避免XML配置,使代码更简洁: ```java @Configuration @EnableAspectJAutoProxy public class AppConfig { @Bean public LoggingAspect ...

    spring2.5 -3.0 hibernate3.3 jar包说明

    实现了slf4j的日志接口,使用log4j作为实际的日志框架。 除了以上Jar包外,还需要考虑数据库驱动以及相关的依赖库。例如,如果使用MySQL数据库,则需要mysql-connector-java.jar。 ### 总结 在使用Spring 2.5至...

    Spring3.0+Struts2.1+ Hibernate3.5融合步骤

    - 以及其他的依赖库,如 log4j、c3p0 等。 #### 2. 配置 Hibernate 接下来,需要配置 Hibernate,以便它可以正确地连接到数据库并执行 CRUD 操作。这通常通过 `hibernate.cfg.xml` 文件完成,该文件定义了数据库...

    Maven多模块 + Spring4.0.6 + SpringMVC4.0.6 + Mybatis 3.2.7 + log4j 2.1

    这个项目使用了Maven进行模块化管理,版本分别对应于Spring 4.0.6、SpringMVC 4.0.6和Mybatis 3.2.7,日志处理则采用了log4j 2.1。下面将详细讲解这些技术及其在项目中的应用。 **Maven多模块项目** Maven是一个...

    spring-quartz jar包

    3. **slf4j-log4j12**: SLF4J的绑定实现,它将SLF4J的日志请求映射到Log4j的具体实现上,这样我们就可以使用SLF4J的API来调用Log4j进行日志记录。 4. **log4j-1.8**: 这是Apache Log4j的一个版本,是一个流行的Java...

Global site tag (gtag.js) - Google Analytics