系统如何集成per4j:
集成logback日志:
- logback.xml 新增下面appender:
<appender name="graphsFileAppender" class="ch.qos.logback.core.FileAppender"> <file>${LOG_HOME}/perf.log</file> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%m%n</pattern> </encoder> </appender> <appender name="coalescingStatistics" class="org.perf4j.logback.AsyncCoalescingStatisticsAppender"> <timeSlice>60000</timeSlice> <!-- 表示60s统计一次 --> <appender-ref ref="graphsFileAppender"/> </appender> <logger name="org.perf4j.TimingLogger" level="info" additivity="false"> <appender-ref ref="coalescingStatistics" /> </logger>
- WEB项目直接在拦截器里拦截:
import **.*.** @Component public class PerformanceInterceptor extends HandlerInterceptorAdapter { private static Logger logger = LoggerFactory.getLogger(PerformanceInterceptor.class); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String reqURI = request.getRequestURI(); if (reqURI.indexOf("css") == -1 && reqURI.indexOf("js") == -1 && reqURI.indexOf("image") == -1) { StopWatch stopWatch = new Slf4JStopWatch(); request.setAttribute("stopWatch", stopWatch); } return true; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { StopWatch stopWatch = (StopWatch) request.getAttribute("stopWatch"); if (stopWatch != null) { String reqURI = request.getRequestURI(); if (reqURI.equals("/")) { stopWatch.stop("http.index"); } else { reqURI = reqURI.replaceAll("/", "."); if (reqURI.endsWith(".")) { reqURI = reqURI.substring(0, reqURI.length() - 1); } stopWatch.stop("http" + reqURI); } stopWatch.lap("http.request.total"); } super.afterCompletion(request, response, handler, ex); } }
- 打开日志文件60后显示:
集成per4j图表
上面讲的是常见的使用方式。但是perf4j也提供了生成图表的方式展示,当然它是以google图标api生成的,所以在被墙的今天这一功能我们基本可以忽视,但使用方式还是说明下:
- 修改logback.xml
<appender name="graphExecutionTimes" class="org.perf4j.logback.GraphingStatisticsAppender"> <!-- GraphType:Mean(平均值), Min(最小值), Max(最大值), TPS(每秒事务数) --> <param name="GraphType" value="Mean"/> <param name="TagNamesToGraph" value="http.pluto.pos.info.search,http.pluto.pos.endorse.detail.html"/> <appender-ref ref="graphsFileAppender"/> </appender> <appender name="graphExecutionTPS" class="org.perf4j.logback.GraphingStatisticsAppender"> <!-- Possible GraphTypes are Mean, Min, Max, StdDev, Count and TPS --> <param name="GraphType" value="TPS"/> <!-- <param name="TagNamesToGraph" value="firstBlock,secondBlock"/> --> <appender-ref ref="graphsFileAppender"/> </appender> <appender name="coalescingStatistics" class="org.perf4j.logback.AsyncCoalescingStatisticsAppender"> <timeSlice>60000</timeSlice> <appender-ref ref="graphExecutionTimes"/> <appender-ref ref="graphExecutionTPS"/> <!-- <appender-ref ref="graphsFileAppender"/> --> </appender>
- 如果是WEB项目则配置好GraphingServlet,能提供页面展示图表:
例如:我使用的是spring boot注册GraphingServlet,则可以采用 127.0.0.1:8080/test/perf4j访问了(注意 图片是访问google的api所以需要翻墙才能看得到效果)
效果图如下:@Bean public ServletRegistrationBean testServletRegistrationBean() { ServletRegistrationBean registration = new ServletRegistrationBean(new GraphingServlet()); registration.setEnabled(true); Map<String,String> map = new HashMap<String,String>(); map.put("graphNames", "graphExecutionTimes,graphExecutionTPS"); registration.setInitParameters(map); registration.addUrlMappings("/perf4j"); return registration; }