похоже, что человечность все еще фиксирует этот https://bugs.launchpad.net/ubuntu / + источник/Linux / + ошибка/978807
Для этого есть встроенная поддержка в Spring.
Я попытался найти руководство, но, к удивлению, я не нашел его, поэтому я попытаюсь объяснить его здесь. (РЕДАКТИРОВАТЬ: я добавил этот пример в свой блог здесь )
В основном вам нужно расширить класс CustomizableTraceInterceptor следующим образом:
public class MyTraceInterceptor extends CustomizableTraceInterceptor {
protected void writeToLog(Log logger, String message, Throwable ex) {
if (ex != null) {
logger.info(message, ex);
} else {
logger.info(message);
}
}
protected boolean isInterceptorEnabled(MethodInvocation invocation, Log logger) {
return true;
}
}
Этот класс обертывает ваши bean-компоненты и выводит информацию о вызовах методов, включая параметры , возвращают значения и время выполнения в журнал. Изменяя метод writeToLog ()
, вы определяете, где вы хотите выводить данные и с какой степенью серьезности.
Теперь вам нужен XML, чтобы фактически выбрать, какие bean-компоненты вы собираетесь обернуть:
<!-- Tracing -->
<bean name="traceInterceptor" class="MyTraceInterceptor" dependency-check="none">
<property name="enterMessage" value="ENTER: $[targetClassShortName].$[methodName]($[arguments])"/>
<property name="exitMessage"
value="EXIT: $[targetClassShortName].$[methodName]() : $[invocationTime]ms : $[returnValue]"/>
</bean>
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" dependency-check="none">
<property name="beanNames" value="*RequestListener,*Notifier"/>
<property name="proxyTargetClass" value="true"/>
<property name="interceptorNames">
<list>
<value>traceInterceptor</value>
</list>
</property>
<property name="order" value="2"/>
</bean>
В основном вы определите bean-компоненты, которые вы хотите обернуть, с помощью подстановочного знака в beanNames, а «order» контролирует порядок упаковки - если вы этого не сделаете Если у вас есть другие классы АОП, вы можете их удалить. Вы также можете изменить формат вывода, если измените свойства enterMessage и exitMessage.
Этого должно быть достаточно, чтобы вы начали. Если вам нужны разъяснения, не стесняйтесь спрашивать.
Подход АОП будет работать, но в зависимости от того, как вы планируете регистрировать информацию, она сама может повлиять на производительность - просто помните об этом, убедитесь, что ведение журнала максимально эффективно и исправление ошибок в вашем аспекте.
Вы также можете выглядеть как Visual VM - я был впечатлен этим инструментом, он прост в использовании и смог предоставить мне только информацию Мне было нужно, когда я в последний раз его использовал.
Помимо VisualVM, о котором Ник упомянул, еще одним хорошим (и бесплатным для разработки) программным обеспечением является Oracle JRockit Mission Control . Его Консоль управления имеет возможность для простых вызовов профилей некоторых методов (плюс есть больше параметров профилирования и определенно быстрее, чем TPTP).
Как и с измерением системного времени до / после вызовов методов: в основном это работает но имеет некоторые незначительные «недостатки» (например, фоновые приложения могут «изменить» результат).
Лично я сначала выбрал бы VisualVM или JRockit Mission Control.
Проблема с "Profiler 101" состоит в том, что он воплощает множество идей, оправдание которых больше зависит от популярности, чем от здравого смысла.
Самая большая из таких идей заключается в том, что лучший способ найти Проблемы с производительностью заключаются в ее измерении.
Это мышление сверху вниз, и это все равно что пытаться найти расточительство в правительстве, просматривая бюджет каждого департамента. Альтернативой является восходящий подход, такой как выбор нескольких случайных единиц денег или времени и (что наиболее важно) полное определение , почему каждая из них тратится.
Если есть потери, это будет быстро найди. Причина проста: если какой-то процент (скажем, 40%) тратится впустую, то этот процент образцов (в среднем) покажет вам, как именно он тратится.
Это метод, не зависящий от языка, который я использую.
ДОБАВЛЕНО: