Возможно ли в springframework регистрировать время, затраченное методами [селективный | все] автоматически. По автоматическому я имею в виду, я не хочу идти к каждому методу и писать log.debug ("...."); вещи.Как записать время, проведенное методами в Springframework?
ответ
АОП - это то, что вам нужно здесь. AOP позволяет добавлять код в приложение без изменения исходного кода. Spring AOP предпочитает это делать с Прокси объектов. Прокси объекты используют узор декоратора для обертывания оригинала Target объект и добавьте код. Прокси Proxy сконфигурирован для реализации одного или нескольких интерфейсов исходного объекта Target.
Здесь, во время приложения, идея заключается в использовании PerformanceMonitorInterceptor
, одного из классов контроля производительности, которые поставляются с Spring Framework.
Первый вариант заключается в использовании класса Spring ProxyFactoryBean
для создания Spring AOP Прокси объектов. Для этого:
- Определите оригинальный боб:
- Определите
PerformanceMonitorInterceptor
: - Определите
RegexpMethodPointcutAdvisor
: - Определение
ProxyFactoryBean
к прокси исходный компонент и применить Advisor - Установите уровень журнала для
PerformanceMonitorInterceptor
на TRACE
Ниже конфигурации 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>
и конфигурации уровня журнала для PerformanceMonitorInterceptor
:
log4j.logger.org.springframework.aop.interceptor.PerformanceMonitorInterceptor=TRACE
Начиная с весны 2.0, есть еще один вариант: используя Spring 2.0 XML Schema-based configuration и весну AspectJ style pointcut expressions. С ProxyFactoryBean
вы должны явно объявить интерфейсы, которые вы хотите прокси; используя теги <aop:config>
и <aop:advisor>
, вы можете автоматически проксировать каждый интерфейс каждого объекта в контейнере контейнера.
<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>
Для этого можно использовать AspectJ, объявить окошко для журнала, вызванное подстановочным знаком, с обработкой до и после обработки с помощью методов before() и after().
может у вас привести пример? –
Наконец-то я понял, как это сделать.
Прежде всего см. Сообщение от '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>
Я вижу, что там уже был принят ответ здесь, но я призываю всех взглянуть на последней версии Spring ToolSuite (Дистрибутив SpringSource по Eclipse). Он поставляется с утилитой профилирования из «Spring Insight», которая обеспечивает точную статистику во время выполнения в хорошем формате. Просто разверните приложение в своем внутреннем tomcat, нажмите несколько страниц, затем перейдите в сервлет/insight и посмотрите время, проведенное в каждом методе, называемом вплоть до SQL-операторов, которые были выполнены и сколько времени они взяли.
Вот ссылка на хорошую запись о Spring Insight, которая должна получить вас, что вы хотите всего за несколько минут. http://www.dotkam.com/2009/10/28/spring-insight-in-action-5-minutes-from-scratch/
Вы можете посмотреть stagemonitor. Это монитор производительности веб-приложений с открытым исходным кодом. Он фиксирует метрики времени ответа, метрики JVM, данные запроса (включая стек вызовов, захваченный профилировщиком запросов) и многое другое. Накладные расходы очень низкие.
По желанию вы можете использовать графический графический редактор с большим сроком хранения, чтобы хранить длинную историю datapoints, с которой вы можете смотреть с помощью удобных панелей.
Пример экрана:
Посмотрите на project website, чтобы увидеть больше скриншотов, описания функций и документации.
Примечание: Я являюсь разработчиком stagemonitor
- 1. Время, проведенное на странице?
- 2. Время, проведенное MapReduce jobs
- 3. Рассчитать время, проведенное в javascript
- 4. Измерение «% Время, проведенное в GC»
- 5. Время, проведенное в режиме ядра
- 6. Как автоматически рассчитывать время, проведенное в JIRA?
- 7. Как измерить общее время, проведенное в функции?
- 8. Время, проведенное на странице страницы
- 9. Как измерить время, проведенное на странице?
- 10. Как отслеживать время, проведенное на сайте
- 11. Записать время работы функции ядра
- 12. Rails показывает неправильное время, проведенное в запросе
- 13. Как получить время, проведенное в пользовательском режиме в процессе win32
- 14. Время, проведенное пользователем на веб-странице
- 15. Слишком долгое время, проведенное функцией Mysql
- 16. Время, проведенное с помощью обзоров пэра?
- 17. Как визуализировать непрерывное время, проведенное в месте нахождения панд?
- 18. Как проведенное время тестирования JUnit вычисляется в Eclipse?
- 19. Как узнать общее время, проведенное в определенном модуле?
- 20. Jetty - как получить время, проведенное в очереди приема?
- 21. Как отображать время, проведенное посетителем на веб-сайте?
- 22. Как отслеживать время, проведенное RactiveJS, для анализа моих шаблонов?
- 23. Получить время, проведенное между двумя итерациями в C
- 24. Время, проведенное в Object. <init> (hprof)
- 25. MySQL Query: долгое время, проведенное в состоянии «init»
- 26. Рассчитать время, проведенное с различными часами в зависимости от дня?
- 27. Вычислить время, проведенное в активном или видимом div (Javascript)
- 28. Как записать время UTC в Azure SQL?
- 29. как записать время прибытия события в esper
- 30. Как записать время выполнения скрипта в Yii?
+1 Кажется, это то, о чем я просил :). –
действительно хорошо. Поздравляю –
Не знаю почему, но он не работает. Также отредактируйте код из * * to * * –