【问题标题】:log4j multilpe thread doesn't write all info in fileslog4j multilpe 线程不会将所有信息写入文件
【发布时间】:2018-01-11 10:31:57
【问题描述】:

我有 2 个线程同时运行,我想在文件中为每个线程写入信息。
我使用了unable to write log on correct file for mulithread?
中描述的方法 我获得了 2 个带有信息的文件,但是当 2 个线程正在运行时,所有信息都不会写入,只是一部分。

class1.java

package loggerTest;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class class1 {

    // this logger will just use rootLogger
    private static Logger log = Logger.getLogger(Thread.currentThread().getName() + "." + class1.class.getName());

    static Worker W = null;
    static SomethingElse SE = null;

    public static void main(String args[]) {

        log.info("Hello world");

        W = new Worker();
        try {
            W.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        W.start();

        SE = new SomethingElse();
        SE.start();    
    }        
}

工人.java 包 loggerTest;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class Worker extends Thread {

    public static Logger LOGGER = Logger.getLogger(Worker.class);

    public static void MainFunction(){
        System.out.println("MainFunction de Worker");;
        try{
            String threadName = "worker_" + 1;
            LOGGER = Logger.getLogger(threadName + "." + Worker.class.getName());    

            //Load the Existing Properties
            Properties log4jprops = new Properties();
            InputStream is = Worker.class.getClassLoader().getResourceAsStream("log4j.properties");
            log4jprops.load( is );           

            //Set the output file for the LOGFILE appender
            log4jprops.setProperty("log4j.appender.WORKER_1_LOG_FILE.File", "./logs/worker1_aa.log");

            //Configure Log4j
            PropertyConfigurator.configure(log4jprops);

            LOGGER.info("--------------processing Worker-----------------");        
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }   

    public void run(){
        int i=0;
        System.out.println("Lancement worker");
        try{
            while(i<5){
                LOGGER.info("W i="+i);
                MainFunction();
                i++;
                this.sleep(2000);
            }
        }
        catch(Exception e){
            e.printStackTrace();
        }
        this.interrupt();
    }

}

SomethingElse.java

package loggerTest;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;    

public class SomethingElse extends Thread {
    private static Logger log = Logger.getLogger(SomethingElse.class);

    static void doIt2(){    
        try{
           String threadName = "worker_" + 2;
           log = Logger.getLogger(threadName + "." + Worker.class.getName());

           //Load the Existing Properties
           Properties log4jprops = new Properties();
           InputStream is = SomethingElse.class.getClassLoader().getResourceAsStream("log4j.properties");
           log4jprops.load( is );

           //Set the output file for the LOGFILE appender
           log4jprops.setProperty("log4j.appender.WORKER_2_LOG_FILE.File", "./logs/worker2_aa.log");

           //Configure Log4j
           PropertyConfigurator.configure(log4jprops);

           log.info("--------------processing SomethingElse-----------------");
        }
        catch(Exception e){
        e.printStackTrace();
        }
     }   

    public void run(){
        int ii=0;
        try{
        while(ii<6){
            log.info("SE ii="+ii);
            doIt2();
            ii++;
            this.sleep(1000);
        }
        }
        catch(Exception e){
        e.printStackTrace();
        }
        this.interrupt();
    }
}

当我单独启动线程 Worker 时,我得到了我想要的:
worker1_aa.log

2018-01-11 10:54:36.321 [Thread-0] 信息 worker_1.loggerTest.Worker - --------------处理工人-----------------
2018-01-11 10:54:38.741 [Thread-0 ] INFO worker_1.loggerTest.Worker - W i=1
2018-01-11 10:54:38.741 [Thread-0] 信息 worker_1.loggerTest.Worker - --------------处理工人-----------------
2018-01-11 10:54:40.756 [Thread-0 ] INFO worker_1.loggerTest.Worker - W i=2
2018-01-11 10:54:40.756 [Thread-0] 信息 worker_1.loggerTest.Worker - --------------处理工人-----------------
2018-01-11 10:54:42.757 [Thread-0 ] INFO worker_1.loggerTest.Worker - W i=3
2018-01-11 10:54:42.757 [Thread-0] 信息 worker_1.loggerTest.Worker - --------------处理工人-----------------
2018-01-11 10:54:44.772 [Thread-0 ] INFO worker_1.loggerTest.Worker - W i=4
2018-01-11 10:54:44.772 [Thread-0] 信息 worker_1.loggerTest.Worker - --------------处理工人------------------

但是当我同时启动 2 个线程时,我在 worker1_aa.log 中获得

2018-01-11 10:02:52.248 [Thread-0] 信息 worker_1.loggerTest.Worker - --------------处理工人-----------------
2018-01-11 10:02:54.277 [Thread-0 ] 信息 worker_1.loggerTest.Worker - --------------处理工人-----------------
2018-01-11 10:02:56.292 [Thread-0 ] 信息 worker_1.loggerTest.Worker - --------------处理工人-----------------
2018-01-11 10:02:58.306 [Thread-0 ] 信息 worker_1.loggerTest.Worker - --------------处理工人-----------------
2018-01-11 10:03:00.318 [Thread-0 ] INFO worker_1.loggerTest.Worker - W i=4
2018-01-11 10:03:00.318 [Thread-0] 信息 worker_1.loggerTest.Worker - --------------处理工人------------------

SomethingElse 也是如此。
我不明白。有什么问题?
我使用 log4j 1.2.17 和 log4j.properties

log4j.rootLogger=INFO, MAIN_LOG_FILE

log4j.appender.MAIN_LOG_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.MAIN_LOG_FILE.File=./logs/main.log
log4j.appender.MAIN_LOG_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIN_LOG_FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p %c - %m%n

log4j.logger.worker_1=INFO, WORKER_1_LOG_FILE
log4j.additivity.worker_1=false

log4j.appender.WORKER_1_LOG_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.WORKER_1_LOG_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.WORKER_1_LOG_FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p %c - %m%n

log4j.logger.worker_2=INFO, WORKER_2_LOG_FILE
log4j.additivity.worker_2=false

log4j.appender.WORKER_2_LOG_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.WORKER_2_LOG_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.WORKER_2_LOG_FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p %c - %m%n

我以前从没用过 log4j,所以我不知道所有的窍门。

更新

我尝试在 log4j.properties 中不使用 log4j.additivity.worker_2=false(因此它也写入主日志),并且消息仅在主日志中完成。
问题一定是appender的配置问题。

【问题讨论】:

  • 不知道?有人吗?

标签: java multithreading log4j


【解决方案1】:

我找到了如何做我想做的事(即使我没有真正找到问题的根源)!
我使用 DailyRollingFileAppender 而不是更改 java 代码中的文件名。
有兴趣的可以看一下代码:

class1.java

public class class1 {

    // this logger will just use rootLogger
    private static Logger log = Logger.getLogger(Thread.currentThread().getName() + "." + class1.class.getName());
    static Worker W = null;
    static SomethingElse SE = null;

    public static void main(String args[]) {
        System.out.println("Hello");        
        log.info("Hello world");

        W = new Worker();
        W.start();

        SE = new SomethingElse();
        SE.start();        

        System.out.println("Byebye");
    }    
}

Worker.java

public class Worker extends Thread {

    public static Logger LOGGER = Logger.getLogger(Worker.class);   

    public void run(){
        int i=0;
        System.out.println("Lancement worker");

        LOGGER = Logger.getLogger( "worker_1" + "." + Worker.class.getName());
        LOGGER.info("--------------processing Worker-----------------");

        try{
            while(i<5){
                LOGGER.info("This is Worker! " + Thread.currentThread().getName() + " logger name: " + Thread.currentThread().getName() + "." + Worker.class.getName());
                LOGGER.info("W i="+i);
                i++;
                this.sleep(2000);
            }
        }
        catch(Exception e){
            e.printStackTrace();
        }
        this.interrupt();
    }
}

SomethingElse.java

public class SomethingElse extends Thread {

     private static Logger log = Logger.getLogger(SomethingElse.class);    

        public void run(){
            int ii=0;

            log = Logger.getLogger( "worker_2" + "." + SomethingElse.class.getName());
            log.info("--------------processing SomethingElse-----------------");

            try{
                while(ii<6){
                    log.info("This is something else! " + Thread.currentThread().getName() + " logger name: " + Thread.currentThread().getName() + "." + SomethingElse.class.getName());
                    log.info("SE ii="+ii);
                    ii++;
                    this.sleep(1000);
                }
            }
            catch(Exception e){
                e.printStackTrace();
            }
            this.interrupt();
        }    
}

log4j.properties:

log4j.rootLogger=INFO, MAIN_LOG_FILE

log4j.appender.MAIN_LOG_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.MAIN_LOG_FILE.File=./logs/main.log
log4j.appender.MAIN_LOG_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIN_LOG_FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p %c - %m%n

log4j.logger.worker_1=INFO, WORKER_1_LOG_FILE
#log4j.additivity.worker_1=false

log4j.appender.WORKER_1_LOG_FILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.WORKER_1_LOG_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.WORKER_1_LOG_FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p %c - %m%n
log4j.appender.WORKER_1_LOG_FILE.File=./logs/worker1
log4j.appender.WORKER_1_LOG_FILE.DatePattern='-'yyyy-MM-dd-HHmm'.log' 

log4j.logger.worker_2=INFO, WORKER_2_LOG_FILE
#log4j.additivity.worker_2=false
#log4j.logger.worker_2.m.SomethingElse=DEBUG

log4j.appender.WORKER_2_LOG_FILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.WORKER_2_LOG_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.WORKER_2_LOG_FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p %c - %m%n
log4j.appender.WORKER_2_LOG_FILE.File=./logs/worker2
log4j.appender.WORKER_2_LOG_FILE.DatePattern='-'yyyy-MM-dd-HHmm'.log'  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 2021-12-19
    • 2013-12-05
    • 2016-01-30
    相关资源
    最近更新 更多