Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Log4J是否在多线程中跳过日志?_Java_Log4j - Fatal编程技术网

Java Log4J是否在多线程中跳过日志?

Java Log4J是否在多线程中跳过日志?,java,log4j,Java,Log4j,我试图对一个实用程序进行压力测试,该实用程序将运行大约4000000个条目,并且严重依赖于记录每个条目。我使用Log4J和RollingFileAppender将我的条目记录到磁盘上 我解决这个问题的方法是创建线程,每个线程包含2000个条目。这相当于大约200个线程 发射器如下所示: public static int COUNT = 0; public static void main(String args[]) throws IOException { final Logge

我试图对一个实用程序进行压力测试,该实用程序将运行大约4000000个条目,并且严重依赖于记录每个条目。我使用Log4J和RollingFileAppender将我的条目记录到磁盘上

我解决这个问题的方法是创建线程,每个线程包含2000个条目。这相当于大约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);

}
<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>
最终的结果有点奇怪

System.out.println将按预期打印4000000,但是 log4j生成的文件只有~200000行!
我错过了什么??谢谢大家。

你们也应该发布你们的log4j配置。RollingFileAppender的全部要点是,当日志文件达到一定大小时,它将被移动到备份。检查是否确实生成了几个日志文件,每个日志文件中有200000行。

我找出了问题所在。您猜对了,这是一个配置问题。RollingFileAppender的MaxBackupIndex设置为1,这确保它只保留1个备份文件,从而覆盖我以前的条目

正确的配置如下所示:

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);

}
<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>

同样感谢您的帮助-非常感谢。

请发布您的Log4j配置。