利用Perf4j 对java项目进行性能监控

本文介绍了如何在Java EE项目中集成Perf4j工具包,通过配置log4j与自定义监控范围的Java代码进行性能记录与统计分析。详细解释了如何设置性能数据输出,包括控制台、日志文件和JMX等,并展示了通过AOP实现对服务性能的批量记录。最后,阐述了Perf4j在实战中的应用,借助于AOP技术,对服务性能进行高效记录与分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Perf4j 可以对自定义监控范围的java代码进行日志记录,再经统计分析生成所需性能数据。Perf4j 提供了对常用日志工具log4j的扩展以方便与产品集成,它产生的性能数据可被用于生成可视化的性能图表。
Perf4j是一款专门用于java服务器端代码计时,记录日志和监控结果的开源工具包。Per4j对常用日志工具包进行了扩展,能够将得到的原始性能数据进行统计并发布到可定制的输出源,如控制台、日志文件、JMX等。
本文主要面向JAVA EE项目,来说明Perf4j集成log4j来进行性能的的分析。
首先要在项目中加入perf4j和log4j的jar包。
然后修改log4j.xml,使得支持perf4j
<!--perf4j的Logger及Appender-->
<!--Perf4Jappenders-->
<!--AsyncCoalescingStatisticsAppender收集StopWatch的日志信息并传送到下游的文件appenders。-->
<appendername="CoalescingStatistics"
class="org.perf4j.log4j.AsyncCoalescingStatisticsAppender">
<!--TimeSlice配置多少时间间隔去做一次汇总写入文件中默认值是30000ms,设置为10分钟-->
<paramname="TimeSlice"value="3600000"/>
<appender-refref="performanceAppenderCSV"/><appender-refref="performanceAppenderLOG"/>
</appender>
<!--把汇总的perf4j的日志信息写到${web.XxxWeb.root}/WEB-INF/logs/perfmance/perfmance.log文件中去-->
<appendername="performanceAppenderLOG"class="org.apache.log4j.FileAppender">
<paramname="File"value="${web.XxxWeb.root}/WEB-INF/logs/perfmance/perfmance.log"/>
<paramname="Append"value="true"/><!--设置是否在重新启动服务时,在原有日志的基础添加新日志-->
<paramname="DatePattern"value="'.'yyyy-MM-dd'.log'"/>
<layoutclass="org.apache.log4j.PatternLayout">
<paramname="ConversionPattern"value="%m%n"/>
</layout>
</appender>
<appendername="performanceAppenderCSV"class="org.apache.log4j.FileAppender">
<paramname="File"value="${web.XxxWeb.root}/WEB-INF/logs/perfmance/perfmance.csv"/>
<paramname="Append"value="true"/><!--设置是否在重新启动服务时,在原有日志的基础添加新日志-->
<paramname="DatePattern"value="'.'yyyy-MM-dd'.csv'"/>
<layoutclass="org.perf4j.log4j.StatisticsCsvLayout">
<paramname="ConversionPattern"value="%m%n"/>
</layout>
</appender>
<!--11、perf4j日志记录器org.perf4j.TimingLogger日志记录在${web.XxxWeb.root}/WEB-INF/logs/performance/目录下-->
<loggername="org.perf4j.TimingLogger"additivity="false">
<levelvalue="INFO"/>
<appender-refref="CoalescingStatistics"/>
</logger>
简单的测试代码如下:
publiclongadd(DmModeldmModel){
StopWatchstopWatch=newSlf4JStopWatch("dmService.add",
"textArgs");
longmaxbh=fydmbDao.getMaxDmbh();
maxbh++;
dmModel.setDqbs("1");
dmModel.setXgsj(newDate());
dmModel.setBh(maxbh);
dmbDao.addFyDm(DmConvertor.modelToFydm(dmModel));
stopWatch.stop();
returndmModel.getBh();
}
运行junit测试即可看到如下结果:
Performance Statistics 2013-09-06 19:00:00 - 2013-09-06 20:00:00
TagAvg(ms) Min Max Std Dev Count
FydmService.addFy 181.0 181 181 0.0 1
最后,介绍perf4j在实战中的应用----借助于aop,实现对服务性能的批量记录
1、配置log4j,如上
2、编写Perf4jInterceptor代码
packagenju.software.XxxWeb.performance;
importjava.lang.reflect.Method;
importjava.util.Arrays;
importjava.util.HashMap;
importjava.util.Map;
importorg.perf4j.StopWatch;
importorg.perf4j.slf4j.Slf4JStopWatch;
importorg.springframework.aop.AfterReturningAdvice;
importorg.springframework.aop.MethodBeforeAdvice;
/**
*@authortyp
*
*/
publicclassPerf4jInterceptorimplementsMethodBeforeAdvice,
AfterReturningAdvice{
/**
*用于存放不同服务的不同方法的stopWatch
*/
privateMap<String,StopWatch>watches=newHashMap<String,StopWatch>();
//在服务中得方法执行之前加入before方法中得如下逻辑,stopWatch开始统计
publicvoidbefore(Methodmethod,Object[]args,Objecttarget)
throwsThrowable{
StringcompleteMethodName=getCompleteMethodName(target,method);
StopWatchstopWatch;
if(watches.containsKey(completeMethodName)){
stopWatch=watches.get(completeMethodName);
stopWatch.start();
}else{
stopWatch=newSlf4JStopWatch(completeMethodName,
Arrays.toString(args));
watches.put(completeMethodName,stopWatch);
}
}
//在服务执行完毕,返回值之前加入如下afterReturning逻辑,stopWatch结束统计
publicvoidafterReturning(ObjectreturnValue,Methodmethod,
Object[]args,Objecttarget)throwsThrowable{
StringcompleteMethodName=getCompleteMethodName(target,method);
//logger.info("After:"+completeMethodName);
//记录性能
if(watches.containsKey(completeMethodName)){
StopWatchstopWatch=watches.get(completeMethodName);
stopWatch.stop();
}
}
/**
*根据目标对象与方法获取方法完整名称.
*
*@paramtarget
*目标对象
*@parammethod
*方法
*@return方法完整名称
*/
privateStringgetCompleteMethodName(Objecttarget,Methodmethod){
StringclassName="";
if(target!=null){
className=target.toString();
intloc=className.indexOf("@");
if(loc>=0){
className=className.substring(0,loc);
}
}
returnclassName+"."+method.getName();
}
}
以上类是附加逻辑,用于对拦截器拦截下的服务添加before和after逻辑。即对所有的服务进行拦截,在服务方法执行之前加入before方法内的逻辑,在服务返回之后加入afterReturning方法逻辑。
3、配置applicationContext.xml
<!--定义Perf4jInterceptor的bean-->
<beanid="perf4jInterceptor"class="nju.software.XxxWeb.performance.Perf4jInterceptor">
</bean>
<!--定义拦截器,定义拦截的服务的列表,以及拦截器的名字,在服务执行之前和之后加入该拦截器中代码-->
<beanid="perf4jProxy"
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<propertyname="beanNames">
<list>
<!--<value>fydmbService</value>-->
<value>dmService</value>
<value>xzqdmbService</value>
<value>gjService</value>
<value>xxxService</value>
<value>gjXxxGxService</value>
<value>gzService</value>
<value>sxgzService</value>
<value>xtyhService</value>
<value>xtjsService</value>
<value>qxService</value>
<value>xtdxService</value>
<value>bmbService</value>
<value>gzbwlService</value>
<value>executionService</value>
<value>repositoryService</value>
<value>taskService</value>
<value>aydmbService</value>
<value>hytglService</value>
<value>hytcyService</value>
<value>sftjPzxxbService</value>
</list>
</property>
<propertyname="interceptorNames">
<list>
<value>perf4jInterceptor</value>
</list>
</property>
</bean>
至此为止,java EE的项目中就可以使用perf4j来统计各种service的性能了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值