Perf4j最主要的一個(gè)好處就是可以跟log4j或者logback來(lái)性能分析和監(jiān)控線(xiàn)上運(yùn)行的程序。集成的方式主要是:自定義log4j的appenders通過(guò)標(biāo)準(zhǔn)的配置加入到log4j中去(后面會(huì)有配置的例子)。有一個(gè)要注意的地方就是需要使用log4j的1.2.14版本或者更高版本。由于我一般都是使用log4j,所以對(duì)于logback的集成我就不描述了,我覺(jué)得應(yīng)該差不多的。
Perf4j最重要的appender就是AsyncCoalescingStatisticsAppender,它會(huì)把一段時(shí)間內(nèi)StopWatch的信息匯總到一個(gè)獨(dú)立的GroupedTimingStatistics日志信息,然后把這個(gè)獨(dú)立的信息傳給下游的appenders,比如fileappenders,這樣就可以寫(xiě)到文件中去了。也可以傳給per4j的其他自定義appenders。
接下來(lái)我們看一個(gè)log4j.xml的例子,有一個(gè)限制,如果要使用AsyncCoalescingStatisticsAppender就只能使用xml文件而不能使用properties文件。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration debug="false" xmlns:log4j="http://jakarta.apache.org/log4j/">
<!--
配置控制臺(tái)輸出
-->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %c{1} - %m%n"/>
</layout>
</appender>
<!-- Perf4J appenders -->
<!--
AsyncCoalescingStatisticsAppender收集StopWatch的日志信息并傳送到下游的文件appenders。
-->
<appender name="CoalescingStatistics"
class="org.perf4j.log4j.AsyncCoalescingStatisticsAppender">
<!--
TimeSlice配置多少時(shí)間間隔去做一次匯總寫(xiě)入文件中
默認(rèn)值是 30000 ms
-->
<param name="TimeSlice" value="10000"/>
<appender-ref ref="fileAppender"/>
</appender>
<!-- 把匯總的perf4j的日志信息寫(xiě)到perfStats.log文件中去 -->
<appender name="fileAppender" class="org.apache.log4j.FileAppender">
<param name="File" value="/home/perfStats.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%m%n"/>
</layout>
</appender>
<!-- Loggers -->
<!--
配置perf4j logger
Additivity設(shè)置成false主要因?yàn)槭遣幌胱尨a運(yùn)行時(shí)間的日志輸出給上游appenders,即不要在控制臺(tái)輸出。
-->
<logger name="org.perf4j.TimingLogger" additivity="false">
<level value="INFO"/>
<appender-ref ref="CoalescingStatistics"/>
</logger>
<!--
Root logger打印所有日志,但不包含perf4j的信息。原因是在TimingLogger配置中設(shè)置了additivity為false
-->
<root>
<level value="INFO"/>
<appender-ref ref="console"/>
</root>
</log4j:configuration>
黃色背景是perf4j的配置信息。其他都是log4j的基本配置。下面是測(cè)試perf4j與log4j集成的代碼。
package com.baowu.perf4j;
import org.apache.log4j.Logger;
import org.perf4j.StopWatch;
import org.perf4j.log4j.Log4JStopWatch;
public class Perf4JAppenderExample {
public static void main (String[] args) throws Exception {
Logger rootLogger = Logger.getRootLogger();
for (int i = 0; i < 10; i++) {
// Log4JStopWatch默認(rèn)使用org.perf4j.TimingLogger這個(gè)類(lèi)
StopWatch stopWatch = new Log4JStopWatch();
//模擬代碼運(yùn)行時(shí)間
Thread.sleep((long) (Math.random() * 1000L));
//打印到控制臺(tái)
rootLogger.info("Normal logging messages only go to the console");
stopWatch.lap("firstBlock");
Thread.sleep((long) (Math.random() * 2000L));
stopWatch.stop("secondBlock");
}
}
}
運(yùn)行代碼。
控制臺(tái)輸出:
INFO root - Normal logging messages only go to the console
INFO root - Normal logging messages only go to the console
INFO root - Normal logging messages only go to the console
INFO root - Normal logging messages only go to the console
INFO root - Normal logging messages only go to the console
INFO root - Normal logging messages only go to the console
INFO root - Normal logging messages only go to the console
INFO root - Normal logging messages only go to the console
INFO root - Normal logging messages only go to the console
INFO root - Normal logging messages only go to the console
文件輸出:

輸出格式也可以改成CSV格式。配置:
<appender name="fileAppender" class="org.apache.log4j.FileAppender">
<param name="File" value="/home/perfStats.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%m%n"/>
</layout>
</appender>
org.apache.log4j.PatternLayout改成org.perf4j.log4j.StatisticsCsvLayout即可。
具體的參數(shù)請(qǐng)查看api。
下載工程