我正在尝试对一个实用程序进行压力测试,该实用程序将运行大约4,000,000个条目,并且严重依赖于记录每个条目。我使用RollingFileAppender
使用Log4J将我的条目记录到磁盘上。
我解决这个问题的方法是创建线程,每个线程占用2,000个条目。这相当于大约200个线程。
发射器如下:
public static int COUNT = 0;
public static void main(String args[]) throws IOException {
final Logger logger = Logger.getLogger("Sift Science Bulk");
final ExecutorService executor = Executors.newFixedThreadPool(200);
for (int i=0; i<200; i++) {
final Runnable uploader = new Runnable() {
@Override
public void run() {
for (int j=0; j<2000; j++) {
synchronized (logger) {
logger.info("test");
COUNT++;
}
}
}
};
executor.execute(uploader);
}
executor.shutdown(); // Wait until all threads are finished. Just don't accept new threads.
while (!executor.isTerminated()) { /*JUST ITERATE INDEFINITELY*/ }
System.out.println(COUNT);
}
最终结果有点奇怪......
System.out.println
将按预期打印4,000,000,但我错过了什么?谢谢你们。
答案 0 :(得分:0)
您也应该发布log4j配置。 RollingFileAppender的重点是,当日志文件达到一定大小时,它将被移动到备份。检查您实际上没有生成多个日志文件,每个日志文件包含200,000行。
答案 1 :(得分:0)
我弄清楚出了什么问题。你猜对了 - 这是一个配置问题。 RollingFileAppender的MaxBackupIndex
设置为1,这确保它只保留1个备份文件,从而覆盖我之前的条目!
现在正确的配置如下:
<appender name="appender1" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="trace.log"/>
<param name="Threshold" value="TRACE"/>
<!-- FIX BELOW -->
<param name="MaxBackupIndex" value="100000000"/>
<param name="MaxFileSize" value="100MB"/>
<!-- FIX ABOVE -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p - %m%n"/>
</layout>
</appender>
感谢您的帮助 - 非常感谢。