我在代码中设置了一些秒表来测量一些代码块,所有的消息都进入我的主日志,而不是进入时间日志。 perfStats.log文件创建得很好,但所有消息都转到root日志,根据我读过的文档,我认为根本日志不应该发生。有什么明显的东西我在这里不见了吗?
perf4j教程link
示例代码
import org.apache.log4j.Logger;
import org.perf4j.LoggingStopWatch;
import org.perf4j.StopWatch;
public class PerfLogger {
/**
* @param args
*/
public static void main(String[] args)
{
Logger logger = Logger.getLogger(PerfLogger.class.getName());
logger.info("Starting perf log test");
StopWatch stopWatch = new LoggingStopWatch("test time");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
stopWatch.stop();
}
}
示例log4j.xml
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
<appender name="STDOUT-DEBUG" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p [%t]%x %M (%F:%L) - %m%n"/>
</layout>
</appender>
<!-- Perf4J appenders -->
<!--
This AsyncCoalescingStatisticsAppender groups StopWatch log messages
into GroupedTimingStatistics messages which it sends on the
file appender defined below
-->
<appender name="CoalescingStatistics"
class="org.perf4j.log4j.AsyncCoalescingStatisticsAppender">
<!--
The TimeSlice option is used to determine the time window for which
all received StopWatch logs are aggregated to create a single
GroupedTimingStatistics log. Here we set it to 10 seconds, overriding
the default of 30000 ms
-->
<param name="TimeSlice" value="10000"/>
<appender-ref ref="fileAppender"/>
</appender>
<!-- This file appender is used to output aggregated performance statistics -->
<appender name="fileAppender" class="org.apache.log4j.FileAppender">
<param name="File" value="perfStats.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%m%n"/>
</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="INFO"/>
<appender-ref ref="CoalescingStatistics"/>
</logger>
<root>
<priority value="info"/>
<appender-ref ref="STDOUT-DEBUG"/>
</root>
</log4j:configuration>
答案 0 :(得分:1)
我检查了jar并且perf4j jar中没有名为 TimingLogger 的类,这也可以在searching their code repository看到,这可以解释不会发送给你的文件期待他们。如果您使用他们在示例中显示的默认 LoggingStopWatch 类,它看起来唯一能做的就是打印到std err,您可以看到here。我尝试在我的代码中更改记录器以使用他们的Log4JStopWatch类,并将xml文件中的记录器更改为 org.perf4j.log4j.Log4JStopWatch ,但消息是stdout而不是文件,这是可能是因为它没有使用我猜的log4j.xml中指定的配置。我将尝试跟进维护项目的团队,看看他们是否有更新的示例或错误修复。
答案 1 :(得分:0)
问题是您正在使用LoggingStopWatch,默认情况下会将其所有输出发送到stderr。您想要使用Log4JStopWatch。 LoggingStopWatch的每个直接子类都是为不同的框架设计的(参见http://perf4j.codehaus.org/apidocs/org/perf4j/LoggingStopWatch.html)。
答案 2 :(得分:0)
org.log4j.TimingLogger 不是类名,而是Perf4j使用的默认记录器名称。如果您使用的是Log4j,则应使用 org.perf4j.log4j.Log4JStopWatch 类,并且在创建时不要忘记使用正确的标记,因为统计数据将按此分组。
按照你的例子:
import org.apache.log4j.Logger;
import org.perf4j.LoggingStopWatch;
import org.perf4j.StopWatch;
public class PerfLogger {
/**
* @param args
*/
public static void main(String[] args)
{
StopWatch stopWatch = new LoggingStopWatch("main(..)");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
stopWatch.stop();
}
}
使用该实现和相同的配置文件,您将获得如下输出:
Performance Statistics 2012-07-03 22:13:20 - 2012-07-03 22:13:30
Tag Avg(ms) Min Max Std Dev Count
main(..) 999.0 999 999 0.0 1
希望这可以澄清这个问题。