Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Springframework中记录方法花费的时间?_Java_Spring_Logging_Log4j - Fatal编程技术网

Java 如何在Springframework中记录方法花费的时间?

Java 如何在Springframework中记录方法花费的时间?,java,spring,logging,log4j,Java,Spring,Logging,Log4j,在springframework中,是否可以自动记录方法[selective | all]所花费的时间。我的意思是,我不想转到每个方法并编写log.debug(“…”);东西 为此,您可以使用before()和after()通知声明一个由通配符调用的日志切入点,并使用pre-and-post处理。AOP就是您在这里需要的。AOP允许您在不修改原始代码的情况下向应用程序添加代码。SpringAOP更喜欢用代理对象来实现这一点。代理对象使用装饰器模式包装原始目标对象并添加代码。代理被配置为实现原始目

在springframework中,是否可以自动记录方法[selective | all]所花费的时间。我的意思是,我不想转到每个方法并编写log.debug(“…”);东西

为此,您可以使用before()和after()通知声明一个由通配符调用的日志切入点,并使用pre-and-post处理。

AOP就是您在这里需要的。AOP允许您在不修改原始代码的情况下向应用程序添加代码。SpringAOP更喜欢用代理对象来实现这一点。代理对象使用装饰器模式包装原始目标对象并添加代码。代理被配置为实现原始目标对象的一个或多个接口

在这里,为应用程序计时,我们的想法是使用Spring框架附带的性能监视类之一

第一个选项是使用Spring类
ProxyFactoryBean
创建Spring AOP代理对象。为此:

  • 定义原始bean:
  • 定义一个
    性能监视器interceptor
  • 定义一个
    RegexpMethodPointcutAdvisor
  • 定义一个
    ProxyFactoryBean
    来代理您的原始bean并应用您的顾问
  • PerformanceMonitorInterceptor的日志级别设置为跟踪
下面是说明这些步骤的Spring配置:

<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>