0

I have 2 threads running in same time, I want write info in file for each.
I used method described in unable to write log on correct file for mulithread?
I obtain 2 files with info but when the 2 threads are running, all infos doesn't write, just a part.

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

Worker.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 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();
    }
}

When I launch thread Worker alone, I have what I want :
worker1_aa.log

2018-01-11 10:54:36.321 [Thread-0] INFO worker_1.loggerTest.Worker - --------------processing 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] INFO worker_1.loggerTest.Worker - --------------processing 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] INFO worker_1.loggerTest.Worker - --------------processing 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] INFO worker_1.loggerTest.Worker - --------------processing 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] INFO worker_1.loggerTest.Worker - --------------processing Worker-----------------

but when I launch the 2 threads in the same time, I obtain in worker1_aa.log

2018-01-11 10:02:52.248 [Thread-0] INFO worker_1.loggerTest.Worker - --------------processing Worker-----------------
2018-01-11 10:02:54.277 [Thread-0] INFO worker_1.loggerTest.Worker - --------------processing Worker-----------------
2018-01-11 10:02:56.292 [Thread-0] INFO worker_1.loggerTest.Worker - --------------processing Worker-----------------
2018-01-11 10:02:58.306 [Thread-0] INFO worker_1.loggerTest.Worker - --------------processing 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] INFO worker_1.loggerTest.Worker - --------------processing Worker-----------------

The same with SomethingElse.
I don't get it. What is the problem?
I use log4j 1.2.17 with a 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

I never use log4j before, so I don't know all the trick.

UPDATE

I tried without log4j.additivity.worker_2=false in the log4j.properties (so it's also write in main log), and the message is complete only in the main.
The problem must be from configuration of appender.

Ehcnalb
  • 466
  • 4
  • 16

1 Answers1

0

I found how to do what I want (even if I not really found the source of my problem)!
I use DailyRollingFileAppender instead of change the name of file in java code.
Here the code for who be interested :

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'  
Ehcnalb
  • 466
  • 4
  • 16