首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >perf4j @Profiled注释不起作用

perf4j @Profiled注释不起作用
EN

Stack Overflow用户
提问于 2011-03-24 04:20:20
回答 6查看 9.6K关注 0票数 7

我已经从perf4J站点浏览了下面的链接,并做了相同的操作:http://perf4j.codehaus.org/devguide.html#Using_Spring_AOP_to_Integrate_Timing_Aspects

在我的spring.xml中添加了以下内容。

代码语言:javascript
复制
<aop:aspectj-autoproxy/>
<bean id="timingAspect" class="org.perf4j.log4j.aop.TimingAspect"/>
<bean id="wscClientBase" class="com.xyz.csa.core.common.WscClientBase"/>

在类WscClientBase中,我使用了@Profiled注释的以下方法。

代码语言:javascript
复制
@Profiled(tag = "SOAPCALLTEST")
public Object sendMessage(Object message) {
    String msg = message.toString();
    if (msg.indexOf(' ') > 1) {
        msg = msg.substring(1, msg.indexOf(' '));
    }
    try {
        Object ret = marshalSendAndReceive(message);
        return ret;
    } catch (RuntimeException ex) {
        throw ex;
    }
}

我没有在应用程序日志中看到perf4j TimingLogger语句。但是,如果我像下面这样突出地使用它(没有注释),我将成功地看到log语句。

代码语言:javascript
复制
public Object sendMessage(Object message) {
    String msg = message.toString();
    if (msg.indexOf(' ') > 1) {
        msg = msg.substring(1, msg.indexOf(' '));
    }
    StopWatch stopWatch = new Slf4JStopWatch();
    try {
        Object ret = marshalSendAndReceive(message);
        stopWatch.stop("PERF_SUCCESS_TAG", msg);
        return ret;
    } catch (RuntimeException ex) {
        stopWatch.stop("PERF_FAILURE_TAG", msg);
        throw ex;
    }
}

我是不是遗漏了什么?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-09-19 11:57:19

Perf4j

这是一个性能分析和检查插件的应用程序。它可以与弹簧集成使用弹簧AOP。它创建一个日志文件,提供给解析器来分析和生成相关信息。在默认情况下,它可以提供平均、平均、std偏差。有关更多一般信息,请查看http://perf4j.codehaus.org/index.html

如何设置Perf4j。对于正常的设置,只需添加perf4j jar并为要监视的每个代码段创建StopWatch实例即可。

代码语言:javascript
复制
StopWatch stopWatch= new StopWatch(“snipletTagName”)
…
//{your code sniplet}
…
stopwatch.stop();

这将创建perf4j监视器,并在控制台上获取日志信息。

本文档的主要目的是通过了解perf4j与spring的集成来进行设置。

1.添加以下所有Jar文件。

代码语言:javascript
复制
   1.perf4j-0.9.16-slf4jonly.jar
   2.aspectjweaver-1.6.12.jar
   3.aopalliance-1.0.jar
   4.commons-logging-1.1.1.jar
   5.logback-classic-1.0.7.jar
   6.logback-core-1.0.7.jar
   7.slf4j-api-1.7.1.jar
   8.perf4j-0.9.16.jar
   9.aspectjrt-1.6.1.jar
   10.commons-jexl-1.1.jar
   11.asm-1.5.3.jar
   12.cglib-2.1_3.jar

确保所有这些罐子都在您的类路径中以及spring库中。

2.创建您自己的logback.xml,perf4j将隐式地使用它,logback.xml的内容将是

代码语言:javascript
复制
<configuration>
    <appender name="perf4jFileAppender"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>logs/perf4j.log</File>
        <encoder>
            <Pattern>%date %-5level [%thread] %logger{36} [%file:%line] %msg%n
            </Pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>logs/perf4j.%d{yyyy-MM-dd}.log</FileNamePattern>
        </rollingPolicy>
    </appender>

    <appender name="CoalescingStatistics"
        class="org.perf4j.logback.AsyncCoalescingStatisticsAppender">
        <param name="TimeSlice" value="1" />        
        <appender-ref ref="perf4jFileAppender" />       
    </appender>

    <appender name="RootConsoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%date %-5level [%thread] %logger{36} [%file:%line] %msg%n
            </pattern>
        </layout>
    </appender>

    <!-- Loggers -->
    <!-- The Perf4J logger. Note that org.perf4j.TimingLogger is the value of 
        the org.perf4j.StopWatch.DEFAULT_LOGGER_NAME constant. Also, note that additivity 
        is set to false, which is usually what is desired - this means that timing 
        statements will only be sent to this logger and NOT to upstream loggers. -->
    <logger name="org.perf4j.TimingLogger" additivity="false">
        <level value="DEBUG" />
        <appender-ref ref="CoalescingStatistics" />
        <appender-ref ref="perf4jFileAppender" />
        <appender-ref ref="RootConsoleAppender" />
    </logger>
</configuration>

3.在春季配置文件中,您需要添加aspectj标记,该标记将启用perf4j的@Profiled注释。

(注意:什么是@Profiled注释?:您将将此标记添加到从spring实例调用或使用依赖项注入的所有类中的所有方法中。对象基本上应该是spring上下文注册的,方法应该由在spring上下文中注册的对象调用。我浪费了一天时间思考为什么我的方法没有被记录,然后我意识到我测试的对象不是spring上下文的一部分。

好的,您需要添加到spring配置xml的代码是

代码语言:javascript
复制
<!-- this is my spring-context.xml -->
<beans>

    <aop:aspectj-autoproxy>
        <aop:include name="timingAspect" />
    </aop:aspectj-autoproxy>

    <bean id="timingAspect" class="org.perf4j.slf4j.aop.TimingAspect" />

<!-- this is the class that will be registered with the spring and now we can get this class and call the method that we need to monitor-->
    <bean class="com.perf4jexample.Test" />


</beans>

4.创建将实现@Profiled注释的Test类。

代码语言:javascript
复制
public class Test {

    private String testVal;

    public Test() {
        // TODO Auto-generated constructor stub
    }

    @Profiled
    public void testing() {
        System.out.println("testt" );
    }

    public String getTestVal() {
        return testVal;
    }

    public void setTestVal(String testVal) {
        this.testVal = testVal;
    }
}

5.现在您已经设置了所有只剩下的测试类,它将启动spring上下文并加载perf4j。

代码语言:javascript
复制
public class Test(){

public static void main(){
        AbstractApplicationContext context = new ClassPathXmlApplicationContext(
                "spring-context.xml");

        context.start();

        Test bean = context.getBean(Test.class);
        bean.testing();
}

我希望通过遵循这些设置,您应该能够在控制台上显示一行perf4j控制台附录。

日志上的Perf4j监视命令:

用于生成在记录器路径上执行的性能统计信息。

代码语言:javascript
复制
java -jar perf4j-0.9.16.jar myLogger.log

用于生成图

代码语言:javascript
复制
java -jar perf4j-0.9.16.jar --graph perfGraphs.out myLogger.log

我希望本教程能帮助您将Spring、perf4j、logback与概要注释集成在一起。

票数 9
EN

Stack Overflow用户

发布于 2011-03-24 07:51:55

尝试在aop:include name="timingAspect"/>中添加< <aop:aspectj-autoproxy/>

您还能确认您在从spring应用程序上下文中检索的对象上调用sendMessage (使用getBean或注入作为依赖项)吗?

票数 2
EN

Stack Overflow用户

发布于 2016-04-08 05:28:19

在这里,我有两种方法可以让perf4j @Profiled工作在spring项目上。先决条件是在依赖项下面添加

代码语言:javascript
复制
"org.aspectj:aspectjweaver",
"org.perf4j:perf4j:0.9.16",
"commons-jexl:commons-jexl:1.1",
"cglib:cglib:3.2.1",

对于普通的spring项目,可能需要添加更多的依赖项,比如spring,aopalliance.这些外观包括在春季启动启动父母中。

1. Java配置

这是最简单的方法,而且大部分都能工作,但我发现不知何故不适用于spring数据JpaRepository方法。它只提供org.perf4j.log4j.aop.TimingAspect bean并执行aspectj自动编程。与上面其他人提供的xml配置相同

代码语言:javascript
复制
@Configuration
@EnableAspectJAutoProxy
public class PerformanceConfig {
    @Bean
    public TimingAspect timingAspect() {
        return new TimingAspect();
    }
}

2.提供您自己的方面

通过这种方式,@Profiled注释的spring-数据存储库接口方法也可以很好地工作。但是这样做的缺点是忽略了@Profiled( tag ='some‘)中给出的标记,并使用joinPoint方法名作为标记。

代码语言:javascript
复制
@Aspect
@Component
public class PerformanceTracker {

    @Around(value="execution(@org.perf4j.aop.Profiled * com.mypackage..*(..))")
    public Object checkPerformance(ProceedingJoinPoint pjp) throws Throwable {
        StopWatch stopWatch = new Log4JStopWatch(pjp.getSignature().toShortString());
        Object result = pjp.proceed();
        stopWatch.stop();
        return result;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5414715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档