Java 如何在Springframework中记录方法花费的时间?
在springframework中,是否可以自动记录方法[selective | all]所花费的时间。我的意思是,我不想转到每个方法并编写log.debug(“…”);东西 为此,您可以使用before()和after()通知声明一个由通配符调用的日志切入点,并使用pre-and-post处理。AOP就是您在这里需要的。AOP允许您在不修改原始代码的情况下向应用程序添加代码。SpringAOP更喜欢用代理对象来实现这一点。代理对象使用装饰器模式包装原始目标对象并添加代码。代理被配置为实现原始目标对象的一个或多个接口 在这里,为应用程序计时,我们的想法是使用Spring框架附带的性能监视类之一 第一个选项是使用Spring类Java 如何在Springframework中记录方法花费的时间?,java,spring,logging,log4j,Java,Spring,Logging,Log4j,在springframework中,是否可以自动记录方法[selective | all]所花费的时间。我的意思是,我不想转到每个方法并编写log.debug(“…”);东西 为此,您可以使用before()和after()通知声明一个由通配符调用的日志切入点,并使用pre-and-post处理。AOP就是您在这里需要的。AOP允许您在不修改原始代码的情况下向应用程序添加代码。SpringAOP更喜欢用代理对象来实现这一点。代理对象使用装饰器模式包装原始目标对象并添加代码。代理被配置为实现原始目
ProxyFactoryBean
创建Spring AOP代理对象。为此:
- 定义原始bean:
- 定义一个
:性能监视器interceptor
- 定义一个
:RegexpMethodPointcutAdvisor
- 定义一个
来代理您的原始bean并应用您的顾问ProxyFactoryBean
- 将
PerformanceMonitorInterceptor的日志级别设置为跟踪
<beans>
<bean id="MyServiceTarget" class="org.myapp.services.MyService">
<property ... />
</bean>
<bean id="timingLogger" class="org.springframework.aop.interceptor.PerformanceMonitorInterceptor"/>
<bean id="timingAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice" ref="timingLogger"/>
<property name="patterns">
<list>
<value>.*</value>
</list>
</property>
</bean>
<bean id="MyService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>org.myapp.services.MyService</value>
</property>
<property name="target"><ref local="MyServiceTarget"/></property>
<property name="interceptorNames">
<list>
<value>timingAdvisor</value>
</list>
</property>
</bean>
</beans>
从Spring2.0开始,还有另一个选项:使用和Spring的。使用ProxyFactoryBean
必须显式声明要代理的接口;使用
和
标记,可以自动代理bean容器中每个对象的每个接口
<beans "add xsd declarations here" >
<bean id="MyService" class="org.myapp.services.MyService">
<property ... />
</bean>
<bean id="timingAdvice"
class="org.springframework.aop.interceptor.PerformanceMonitorInterceptor"/>
<aop:config>
<aop:advisor pointcut="execution(* org.myapp.services.MyService.*(..))"
advice-ref="timingAdvice"/>
</aop:config>
</beans>
我终于想出了办法 首先,看到“Pascal Thivent”的帖子,它对我帮助很大。更改log4j.properties并创建timingAdvisor后,必须将此顾问绑定到所需的类以启用调试。您必须像这样更改代码 早期代码:
<bean id="myTableDao" class="com.xyz.sc.db.dao.MyTableDaoImpl" parent="commonDataSource" >
<property name="anotherDao" ref="anotherDao"/>
</bean>
新代码。
<bean id="myTableDaoTarget" class="com.xyz.sc.db.dao.MyTableDaoImpl" parent="commonDataSource" >
<property name="anotherDao" ref="anotherDao"/>
</bean>
<bean id="myTableDao" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>com.xyz.sc.db.dao.MyTableDao</value>
</property>
<property name="target"><ref local="myTableDaoTarget"/></property>
<property name="interceptorNames">
<list>
<value>timingAdvisor</value>
</list>
</property>
</bean>
com.xyz.sc.db.dao.MyTableDao
定时dvisor
我看到这里已经有了一个公认的答案,但我鼓励大家看看最新版本的Spring Toolsuite(SpringSource的Eclipse发行版)。它附带了一个现成的分析工具SpringInsight,它以一种很好的格式在运行时提供这些精确的统计数据。只需将应用程序部署到其内部tomcat,点击几页,然后转到/insight servlet,查看调用每个方法所花费的时间,一直到执行的SQL语句,以及它们所花费的时间
这里有一个链接,指向一篇关于SpringInsight的好文章,它可以在几分钟内让您得到想要的东西 你可以看看。它是一个开源java web应用程序性能监视器。它捕获响应时间度量、JVM度量、请求详细信息(包括请求探查器捕获的调用堆栈)等等。开销很低
或者,您可以使用伟大的timeseries数据库graphite来存储数据点的长期历史,您可以使用漂亮的仪表板查看这些数据点
示例屏幕截图:
请查看,以查看更多屏幕截图、功能描述和文档
注意:我是stagemonitor的开发人员,我不知道为什么,但它不工作。另外,从到编辑代码,只是它没有记录任何内容,我添加了指定的行u以启用跟踪,但没有工作。然后,我删除了我现有的log4j道具,并创建了一个新的道具,其中包含了您提到的所有内容,即使这样,我在日志中也没有得到任何信息:|该配置代码段本身不会起任何作用。您需要声明一个Spring AOP BeanPostProcessor(或者它是BeanFactoryPostProcessor)来使用timingAdvisor自动代理bean。我已经更新了我的答案,以详细说明如何使用
ProxyFactoryBean
<bean id="myTableDaoTarget" class="com.xyz.sc.db.dao.MyTableDaoImpl" parent="commonDataSource" >
<property name="anotherDao" ref="anotherDao"/>
</bean>
<bean id="myTableDao" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>com.xyz.sc.db.dao.MyTableDao</value>
</property>
<property name="target"><ref local="myTableDaoTarget"/></property>
<property name="interceptorNames">
<list>
<value>timingAdvisor</value>
</list>
</property>
</bean>